From 51046a9fbf4bc1ee4b9b9e830daaf921405e681c Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Sun, 25 Jul 1999 20:02:21 +0000 Subject: [PATCH] README.win32 Add HAVE_WINTAB. Undefine it if bulding without the Wintab * README.win32 * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without the Wintab SDK. * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work OK, but getting closer. Guard against bogus tilt data from Wacom ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to enable easier building without Wintab. * gdk/win32/gdkinput.h * gdk/win32/gdkevents.c * gdk/win32/gdkwindow.c: Minor changes related related to above. * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 code. As we have just one visual on Win32, no sense to have it in a table, and no need for the hash table. --- ChangeLog | 23 +- ChangeLog.pre-2-0 | 23 +- ChangeLog.pre-2-10 | 23 +- ChangeLog.pre-2-2 | 23 +- ChangeLog.pre-2-4 | 23 +- ChangeLog.pre-2-6 | 23 +- ChangeLog.pre-2-8 | 23 +- README.win32 | 3 +- config.h.win32 | 3 + gdk/win32/gdkevents-win32.c | 7 + gdk/win32/gdkevents.c | 7 + gdk/win32/gdkinput-win32.c | 458 +++++++++++++++++++++++------------ gdk/win32/gdkinput.c | 458 +++++++++++++++++++++++------------ gdk/win32/gdkinput.h | 39 --- gdk/win32/gdkvisual-win32.c | 464 ++++++++++++------------------------ gdk/win32/gdkvisual.c | 464 ++++++++++++------------------------ gdk/win32/gdkwindow-win32.c | 1 - gdk/win32/gdkwindow.c | 1 - 18 files changed, 1076 insertions(+), 990 deletions(-) diff --git a/ChangeLog b/ChangeLog index ccb53c916e..ae36e9286a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,30 @@ -1999-07-21 Tor Lillqvist +1999-07-25 Tor Lillqvist + + * README.win32 + * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without + the Wintab SDK. + + * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work + OK, but getting closer. Guard against bogus tilt data from Wacom + ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to + enable easier building without Wintab. + + * gdk/win32/gdkinput.h + * gdk/win32/gdkevents.c + * gdk/win32/gdkwindow.c: Minor changes related related to above. + * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 + code. As we have just one visual on Win32, no sense to have it in a + table, and no need for the hash table. + +1999-07-21 Tor Lillqvist + * README.win32: Update gcc build instructions. Mention gettext is GPL. * gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct supported cursor size with GetSystemMetrics. - + * gdk/win32/gdkfont.c * gtk/gtkfontsel.c: Guard against some font weight and charset symbols being undefined (in mingw32 headers). diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index ccb53c916e..ae36e9286a 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,11 +1,30 @@ -1999-07-21 Tor Lillqvist +1999-07-25 Tor Lillqvist + + * README.win32 + * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without + the Wintab SDK. + + * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work + OK, but getting closer. Guard against bogus tilt data from Wacom + ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to + enable easier building without Wintab. + + * gdk/win32/gdkinput.h + * gdk/win32/gdkevents.c + * gdk/win32/gdkwindow.c: Minor changes related related to above. + * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 + code. As we have just one visual on Win32, no sense to have it in a + table, and no need for the hash table. + +1999-07-21 Tor Lillqvist + * README.win32: Update gcc build instructions. Mention gettext is GPL. * gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct supported cursor size with GetSystemMetrics. - + * gdk/win32/gdkfont.c * gtk/gtkfontsel.c: Guard against some font weight and charset symbols being undefined (in mingw32 headers). diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index ccb53c916e..ae36e9286a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,11 +1,30 @@ -1999-07-21 Tor Lillqvist +1999-07-25 Tor Lillqvist + + * README.win32 + * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without + the Wintab SDK. + + * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work + OK, but getting closer. Guard against bogus tilt data from Wacom + ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to + enable easier building without Wintab. + + * gdk/win32/gdkinput.h + * gdk/win32/gdkevents.c + * gdk/win32/gdkwindow.c: Minor changes related related to above. + * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 + code. As we have just one visual on Win32, no sense to have it in a + table, and no need for the hash table. + +1999-07-21 Tor Lillqvist + * README.win32: Update gcc build instructions. Mention gettext is GPL. * gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct supported cursor size with GetSystemMetrics. - + * gdk/win32/gdkfont.c * gtk/gtkfontsel.c: Guard against some font weight and charset symbols being undefined (in mingw32 headers). diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index ccb53c916e..ae36e9286a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,11 +1,30 @@ -1999-07-21 Tor Lillqvist +1999-07-25 Tor Lillqvist + + * README.win32 + * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without + the Wintab SDK. + + * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work + OK, but getting closer. Guard against bogus tilt data from Wacom + ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to + enable easier building without Wintab. + + * gdk/win32/gdkinput.h + * gdk/win32/gdkevents.c + * gdk/win32/gdkwindow.c: Minor changes related related to above. + * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 + code. As we have just one visual on Win32, no sense to have it in a + table, and no need for the hash table. + +1999-07-21 Tor Lillqvist + * README.win32: Update gcc build instructions. Mention gettext is GPL. * gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct supported cursor size with GetSystemMetrics. - + * gdk/win32/gdkfont.c * gtk/gtkfontsel.c: Guard against some font weight and charset symbols being undefined (in mingw32 headers). diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index ccb53c916e..ae36e9286a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,11 +1,30 @@ -1999-07-21 Tor Lillqvist +1999-07-25 Tor Lillqvist + + * README.win32 + * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without + the Wintab SDK. + + * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work + OK, but getting closer. Guard against bogus tilt data from Wacom + ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to + enable easier building without Wintab. + + * gdk/win32/gdkinput.h + * gdk/win32/gdkevents.c + * gdk/win32/gdkwindow.c: Minor changes related related to above. + * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 + code. As we have just one visual on Win32, no sense to have it in a + table, and no need for the hash table. + +1999-07-21 Tor Lillqvist + * README.win32: Update gcc build instructions. Mention gettext is GPL. * gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct supported cursor size with GetSystemMetrics. - + * gdk/win32/gdkfont.c * gtk/gtkfontsel.c: Guard against some font weight and charset symbols being undefined (in mingw32 headers). diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index ccb53c916e..ae36e9286a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,11 +1,30 @@ -1999-07-21 Tor Lillqvist +1999-07-25 Tor Lillqvist + + * README.win32 + * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without + the Wintab SDK. + + * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work + OK, but getting closer. Guard against bogus tilt data from Wacom + ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to + enable easier building without Wintab. + + * gdk/win32/gdkinput.h + * gdk/win32/gdkevents.c + * gdk/win32/gdkwindow.c: Minor changes related related to above. + * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 + code. As we have just one visual on Win32, no sense to have it in a + table, and no need for the hash table. + +1999-07-21 Tor Lillqvist + * README.win32: Update gcc build instructions. Mention gettext is GPL. * gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct supported cursor size with GetSystemMetrics. - + * gdk/win32/gdkfont.c * gtk/gtkfontsel.c: Guard against some font weight and charset symbols being undefined (in mingw32 headers). diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index ccb53c916e..ae36e9286a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,11 +1,30 @@ -1999-07-21 Tor Lillqvist +1999-07-25 Tor Lillqvist + + * README.win32 + * config.h.win32: Add HAVE_WINTAB. Undefine it if bulding without + the Wintab SDK. + + * gdk/win32/gdkinput.c: Hack some more. Still doesn't quite work + OK, but getting closer. Guard against bogus tilt data from Wacom + ArtPad II with the 3.40 driver. Add ifdefs for HAVE_WINTAB to + enable easier building without Wintab. + + * gdk/win32/gdkinput.h + * gdk/win32/gdkevents.c + * gdk/win32/gdkwindow.c: Minor changes related related to above. + * gdk/win32/gdkvisual.c: Simplify a lot, remove leftovers from X11 + code. As we have just one visual on Win32, no sense to have it in a + table, and no need for the hash table. + +1999-07-21 Tor Lillqvist + * README.win32: Update gcc build instructions. Mention gettext is GPL. * gdk/win32/gdkcursor.c (gdk_cursor_new_from_pixmap): Get correct supported cursor size with GetSystemMetrics. - + * gdk/win32/gdkfont.c * gtk/gtkfontsel.c: Guard against some font weight and charset symbols being undefined (in mingw32 headers). diff --git a/README.win32 b/README.win32 index 3c5b5b40fc..fe7ac8a722 100644 --- a/README.win32 +++ b/README.win32 @@ -14,7 +14,8 @@ See the README.win32 file in the GLib distribution for instructions how to build with gcc. The tablet support uses the Wintab API. The Wintab development kit can -be downloaded from http://www.pointing.com. +be downloaded from http://www.pointing.com. If you don't care for +that, undefine HAVE_WINTAB in config.h.win32 before building. GTk+ wants to be built with the GNU gettext library for internationalisation (i18n). Get the version ported to Win32 (not a diff --git a/config.h.win32 b/config.h.win32 index cfb2380bf5..eb6e053c4c 100755 --- a/config.h.win32 +++ b/config.h.win32 @@ -182,3 +182,6 @@ /* define if compiled symbols have a leading underscore */ /* #undef WITH_SYMBOL_UNDERSCORE */ + +/* Define if you have the Wintab programmer's kit */ +#define HAVE_WINTAB 1 diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index d5b1dbfca3..d4b5a48460 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -28,9 +28,13 @@ #include "config.h" #include + #include #include #include "gdkx.h" +#ifdef HAVE_WINTAB +#include +#endif #include "gdkinput.h" #define PING() printf("%s: %d\n",__FILE__,__LINE__),fflush(stdout) @@ -2782,6 +2786,7 @@ gdk_event_translate (GdkEvent *event, return_val = window_private && !window_private->destroyed; break; +#ifdef HAVE_WINTAB /* Handle WINTAB events here, as we know that gdkinput.c will * use the fixed WT_DEFBASE as lcMsgBase, and we thus can use the * constants as case labels. @@ -2801,9 +2806,11 @@ gdk_event_translate (GdkEvent *event, g_print ("WT_PROXIMITY: %#x %d %d\n", xevent->wParam, LOWORD (xevent->lParam), HIWORD (xevent->lParam))); + /* Fall through */ wintab: return_val = gdk_input_vtable.other_event(event, xevent); break; +#endif } bypass_switch: diff --git a/gdk/win32/gdkevents.c b/gdk/win32/gdkevents.c index d5b1dbfca3..d4b5a48460 100644 --- a/gdk/win32/gdkevents.c +++ b/gdk/win32/gdkevents.c @@ -28,9 +28,13 @@ #include "config.h" #include + #include #include #include "gdkx.h" +#ifdef HAVE_WINTAB +#include +#endif #include "gdkinput.h" #define PING() printf("%s: %d\n",__FILE__,__LINE__),fflush(stdout) @@ -2782,6 +2786,7 @@ gdk_event_translate (GdkEvent *event, return_val = window_private && !window_private->destroyed; break; +#ifdef HAVE_WINTAB /* Handle WINTAB events here, as we know that gdkinput.c will * use the fixed WT_DEFBASE as lcMsgBase, and we thus can use the * constants as case labels. @@ -2801,9 +2806,11 @@ gdk_event_translate (GdkEvent *event, g_print ("WT_PROXIMITY: %#x %d %d\n", xevent->wParam, LOWORD (xevent->lParam), HIWORD (xevent->lParam))); + /* Fall through */ wintab: return_val = gdk_input_vtable.other_event(event, xevent); break; +#endif } bypass_switch: diff --git a/gdk/win32/gdkinput-win32.c b/gdk/win32/gdkinput-win32.c index 70063a7a72..03ff326ead 100644 --- a/gdk/win32/gdkinput-win32.c +++ b/gdk/win32/gdkinput-win32.c @@ -33,8 +33,49 @@ #include #include "gdkx.h" + +#ifdef HAVE_WINTAB +#include +#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE | PK_ORIENTATION) +#define PACKETMODE (PK_BUTTONS) +#include +#endif + #include "gdkinput.h" +struct _GdkDevicePrivate { + GdkDeviceInfo info; + + /* information about the axes */ + GdkAxisInfo *axes; + + /* reverse lookup on axis use type */ + gint axis_for_use[GDK_AXIS_LAST]; + + /* true if we need to select a different set of events, but + * can't because this is the core pointer + */ + gint needs_update; + + /* State of buttons */ + gint button_state; + + gint *last_axis_data; + gint last_buttons; +#ifdef HAVE_WINTAB + /* WINTAB stuff: */ + HCTX hctx; + /* Cursor number */ + UINT cursor; + /* The cursor's CSR_PKTDATA */ + WTPKT pktdata; + /* CSR_NPBTNMARKS */ + UINT npbtnmarks[2]; + /* Azimuth and altitude axis */ + AXIS orientation_axes[2]; +#endif +}; + #ifndef M_PI #define M_PI 3.14159265358979323846 #endif @@ -47,12 +88,33 @@ * good at all. */ +#ifdef HAVE_WINTAB +#define DEBUG_WINTAB 1 +#endif + #define TWOPI (2.*M_PI) #define PING() g_print("%s: %d\n",__FILE__,__LINE__) /* Forward declarations */ +static gint gdk_input_enable_window (GdkWindow *window, + GdkDevicePrivate *gdkdev); +static gint gdk_input_disable_window (GdkWindow *window, + GdkDevicePrivate *gdkdev); +static void gdk_input_none_get_pointer (GdkWindow *window, + guint32 deviceid, + gdouble *x, + gdouble *y, + gdouble *pressure, + gdouble *xtilt, + gdouble *ytilt, + GdkModifierType *mask); + +static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid); + +#ifdef HAVE_WINTAB + static gint gdk_input_win32_set_mode (guint32 deviceid, GdkInputMode mode); static void gdk_input_win32_get_pointer (GdkWindow *window, @@ -63,14 +125,6 @@ static void gdk_input_win32_get_pointer (GdkWindow *window, gdouble *xtilt, gdouble *ytilt, GdkModifierType *mask); -static void gdk_input_none_get_pointer (GdkWindow *window, - guint32 deviceid, - gdouble *x, - gdouble *y, - gdouble *pressure, - gdouble *xtilt, - gdouble *ytilt, - GdkModifierType *mask); static gint gdk_input_win32_grab_pointer (GdkWindow * window, gint owner_events, GdkEventMask event_mask, @@ -89,10 +143,12 @@ static gint gdk_input_win32_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev); static GdkInputWindow *gdk_input_window_find (GdkWindow *window); +#if !USE_SYSCONTEXT static GdkInputWindow *gdk_input_window_find_within (GdkWindow *window); -static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid); +#endif static GdkDevicePrivate *gdk_input_find_dev_from_ctx (HCTX hctx, UINT id); +#endif /* HAVE_WINTAB */ /* Local variables */ @@ -126,7 +182,7 @@ GdkInputVTable gdk_input_vtable; gint gdk_input_ignore_core; gint gdk_input_ignore_wintab = FALSE; -#if 0 +#if DEBUG_WINTAB static void print_lc(LOGCONTEXT *lc) @@ -228,6 +284,8 @@ print_lc(LOGCONTEXT *lc) void gdk_input_init (void) { + guint32 deviceid_counter = 0; +#ifdef HAVE_WINTAB GdkDevicePrivate *gdkdev; GdkWindowPrivate *window_private; GdkWindowAttr wa; @@ -235,10 +293,11 @@ gdk_input_init (void) LOGCONTEXT defcontext; HCTX *hctx; UINT ndevices, ncursors, ncsrtypes, firstcsr, hardware; - AXIS axis_x, axis_y, axis_npressure, axis_orientation[3]; + BOOL active; + AXIS axis_x, axis_y, axis_npressure, axis_or[3]; int i, j, k; + int devix, cursorix; char devname[100], csrname[100]; - guint32 deviceid_counter = 0; gdk_input_devices = NULL; wintab_contexts = NULL; @@ -247,18 +306,25 @@ gdk_input_init (void) WTInfo (0, 0, NULL)) { WTInfo (WTI_INTERFACE, IFC_SPECVERSION, &specversion); - + GDK_NOTE (MISC, g_print ("Wintab interface version %d.%d\n", + HIBYTE (specversion), LOBYTE (specversion))); #if USE_SYSCONTEXT WTInfo (WTI_DEFSYSCTX, 0, &defcontext); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("DEFSYSCTX:\n"), print_lc(&defcontext))); +#endif #else WTInfo (WTI_DEFCONTEXT, 0, &defcontext); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("DEFCONTEXT:\n"), print_lc(&defcontext))); #endif -#if 0 - g_print("DEFCONTEXT:\n"); print_lc(&defcontext); #endif WTInfo (WTI_INTERFACE, IFC_NDEVICES, &ndevices); WTInfo (WTI_INTERFACE, IFC_NCURSORS, &ncursors); - +#if DEBUG_WINTAB + GDK_NOTE (MISC, g_print ("NDEVICES: %d, NCURSORS: %d\n", + ndevices, ncursors)); +#endif /* Create a dummy window to receive wintab events */ wa.wclass = GDK_INPUT_OUTPUT; wa.event_mask = GDK_ALL_EVENTS_MASK; @@ -275,61 +341,64 @@ gdk_input_init (void) gdk_window_ref (wintab_window); window_private = (GdkWindowPrivate *) wintab_window; - for (i = 0; i < ndevices; i++) + for (devix = 0; devix < ndevices; devix++) { LOGCONTEXT lc; - WTInfo (WTI_DEVICES + i, DVC_NAME, devname); + WTInfo (WTI_DEVICES + devix, DVC_NAME, devname); - WTInfo (WTI_DEVICES + i, DVC_NCSRTYPES, &ncsrtypes); - WTInfo (WTI_DEVICES + i, DVC_FIRSTCSR, &firstcsr); - WTInfo (WTI_DEVICES + i, DVC_HARDWARE, &hardware); - WTInfo (WTI_DEVICES + i, DVC_X, &axis_x); - WTInfo (WTI_DEVICES + i, DVC_Y, &axis_y); - WTInfo (WTI_DEVICES + i, DVC_NPRESSURE, &axis_npressure); - WTInfo (WTI_DEVICES + i, DVC_ORIENTATION, axis_orientation); + WTInfo (WTI_DEVICES + devix, DVC_NCSRTYPES, &ncsrtypes); + WTInfo (WTI_DEVICES + devix, DVC_FIRSTCSR, &firstcsr); + WTInfo (WTI_DEVICES + devix, DVC_HARDWARE, &hardware); + WTInfo (WTI_DEVICES + devix, DVC_X, &axis_x); + WTInfo (WTI_DEVICES + devix, DVC_Y, &axis_y); + WTInfo (WTI_DEVICES + devix, DVC_NPRESSURE, &axis_npressure); + WTInfo (WTI_DEVICES + devix, DVC_ORIENTATION, axis_or); if (HIBYTE (specversion) > 1 || LOBYTE (specversion) >= 1) { - WTInfo (WTI_DDCTXS + i, CTX_NAME, lc.lcName); - WTInfo (WTI_DDCTXS + i, CTX_OPTIONS, &lc.lcOptions); + WTInfo (WTI_DDCTXS + devix, CTX_NAME, lc.lcName); + WTInfo (WTI_DDCTXS + devix, CTX_OPTIONS, &lc.lcOptions); lc.lcOptions |= CXO_MESSAGES; +#if USE_SYSCONTEXT + lc.lcOptions |= CXO_SYSTEM; +#endif lc.lcStatus = 0; - WTInfo (WTI_DDCTXS + i, CTX_LOCKS, &lc.lcLocks); + WTInfo (WTI_DDCTXS + devix, CTX_LOCKS, &lc.lcLocks); lc.lcMsgBase = WT_DEFBASE; - lc.lcDevice = i; - lc.lcPktRate = 20; + lc.lcDevice = devix; + lc.lcPktRate = 50; lc.lcPktData = PACKETDATA; lc.lcPktMode = PK_BUTTONS; /* We want buttons in relative mode */ lc.lcMoveMask = PACKETDATA; lc.lcBtnDnMask = lc.lcBtnUpMask = ~0; - WTInfo (WTI_DDCTXS + i, CTX_INORGX, &lc.lcInOrgX); - WTInfo (WTI_DDCTXS + i, CTX_INORGY, &lc.lcInOrgY); - WTInfo (WTI_DDCTXS + i, CTX_INORGZ, &lc.lcInOrgZ); - WTInfo (WTI_DDCTXS + i, CTX_INEXTX, &lc.lcInExtX); - WTInfo (WTI_DDCTXS + i, CTX_INEXTY, &lc.lcInExtY); - WTInfo (WTI_DDCTXS + i, CTX_INEXTZ, &lc.lcInExtZ); + WTInfo (WTI_DDCTXS + devix, CTX_INORGX, &lc.lcInOrgX); + WTInfo (WTI_DDCTXS + devix, CTX_INORGY, &lc.lcInOrgY); + WTInfo (WTI_DDCTXS + devix, CTX_INORGZ, &lc.lcInOrgZ); + WTInfo (WTI_DDCTXS + devix, CTX_INEXTX, &lc.lcInExtX); + WTInfo (WTI_DDCTXS + devix, CTX_INEXTY, &lc.lcInExtY); + WTInfo (WTI_DDCTXS + devix, CTX_INEXTZ, &lc.lcInExtZ); lc.lcOutOrgX = axis_x.axMin; lc.lcOutOrgY = axis_y.axMin; lc.lcOutExtX = axis_x.axMax - axis_x.axMin; lc.lcOutExtY = axis_y.axMax - axis_y.axMin; lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */ - WTInfo (WTI_DDCTXS + i, CTX_SENSX, &lc.lcSensX); - WTInfo (WTI_DDCTXS + i, CTX_SENSY, &lc.lcSensY); - WTInfo (WTI_DDCTXS + i, CTX_SENSZ, &lc.lcSensZ); - WTInfo (WTI_DDCTXS + i, CTX_SYSMODE, &lc.lcSysMode); + WTInfo (WTI_DDCTXS + devix, CTX_SENSX, &lc.lcSensX); + WTInfo (WTI_DDCTXS + devix, CTX_SENSY, &lc.lcSensY); + WTInfo (WTI_DDCTXS + devix, CTX_SENSZ, &lc.lcSensZ); + WTInfo (WTI_DDCTXS + devix, CTX_SYSMODE, &lc.lcSysMode); lc.lcSysOrgX = lc.lcSysOrgY = 0; - WTInfo (WTI_DDCTXS + i, CTX_SYSEXTX, &lc.lcSysExtX); - WTInfo (WTI_DDCTXS + i, CTX_SYSEXTY, &lc.lcSysExtY); - WTInfo (WTI_DDCTXS + i, CTX_SYSSENSX, &lc.lcSysSensX); - WTInfo (WTI_DDCTXS + i, CTX_SYSSENSY, &lc.lcSysSensY); + WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTX, &lc.lcSysExtX); + WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTY, &lc.lcSysExtY); + WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSX, &lc.lcSysSensX); + WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSY, &lc.lcSysSensY); } else { lc = defcontext; lc.lcOptions |= CXO_MESSAGES; lc.lcMsgBase = WT_DEFBASE; - lc.lcPktRate = 20; /* Slow down the packets a bit */ + lc.lcPktRate = 50; lc.lcPktData = PACKETDATA; lc.lcPktMode = PACKETMODE; lc.lcMoveMask = PACKETDATA; @@ -344,8 +413,9 @@ gdk_input_init (void) lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */ #endif } -#if 0 - g_print("context for device %d:\n", i); print_lc(&lc); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("context for device %d:\n", devix), + print_lc(&lc))); #endif hctx = g_new (HCTX, 1); if ((*hctx = WTOpen (window_private->xwindow, &lc, TRUE)) == NULL) @@ -353,8 +423,8 @@ gdk_input_init (void) g_warning ("gdk_input_init: WTOpen failed"); return; } - GDK_NOTE (MISC, g_print ("gdk_input_init: opened Wintab device %d %#x\n", - i, *hctx)); + GDK_NOTE (MISC, g_print ("opened Wintab device %d %#x\n", + devix, *hctx)); wintab_contexts = g_list_append (wintab_contexts, hctx); #if 0 @@ -362,13 +432,18 @@ gdk_input_init (void) #endif WTOverlap (*hctx, TRUE); -#if 0 - g_print("context for device %d after WTOpen:\n", i); print_lc(&lc); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("context for device %d after WTOpen:\n", devix), + print_lc(&lc))); #endif - for (j = firstcsr; j < firstcsr + ncsrtypes; j++) + for (cursorix = firstcsr; cursorix < firstcsr + ncsrtypes; cursorix++) { + active = FALSE; + WTInfo (WTI_CURSORS + cursorix, CSR_ACTIVE, &active); + if (!active) + continue; gdkdev = g_new (GdkDevicePrivate, 1); - WTInfo (WTI_CURSORS + j, CSR_NAME, csrname); + WTInfo (WTI_CURSORS + cursorix, CSR_NAME, csrname); gdkdev->info.name = g_strconcat (devname, " ", csrname, NULL); gdkdev->info.deviceid = deviceid_counter++; gdkdev->info.source = GDK_SOURCE_PEN; @@ -379,8 +454,8 @@ gdk_input_init (void) gdkdev->info.has_cursor = FALSE; #endif gdkdev->hctx = *hctx; - gdkdev->cursor = j; - WTInfo (WTI_CURSORS + j, CSR_PKTDATA, &gdkdev->pktdata); + gdkdev->cursor = cursorix; + WTInfo (WTI_CURSORS + cursorix, CSR_PKTDATA, &gdkdev->pktdata); gdkdev->info.num_axes = 0; if (gdkdev->pktdata & PK_X) gdkdev->info.num_axes++; @@ -388,9 +463,18 @@ gdk_input_init (void) gdkdev->info.num_axes++; if (gdkdev->pktdata & PK_NORMAL_PRESSURE) gdkdev->info.num_axes++; + /* The wintab driver for the Wacom ArtPad II reports + * PK_ORIENTATION in CSR_PKTDATA, but the tablet doesn't + * actually sense tilt. Catch this by noticing that the + * orientation axis's azimuth resolution is zero. + */ + if ((gdkdev->pktdata & PK_ORIENTATION) + && axis_or[0].axResolution == 0) + gdkdev->pktdata &= ~PK_ORIENTATION; + if (gdkdev->pktdata & PK_ORIENTATION) gdkdev->info.num_axes += 2; /* x and y tilt */ - WTInfo (WTI_CURSORS + j, CSR_NPBTNMARKS, &gdkdev->npbtnmarks); + WTInfo (WTI_CURSORS + cursorix, CSR_NPBTNMARKS, &gdkdev->npbtnmarks); gdkdev->axes = g_new (GdkAxisInfo, gdkdev->info.num_axes); gdkdev->info.axes = g_new (GdkAxisUse, gdkdev->info.num_axes); gdkdev->last_axis_data = g_new (gint, gdkdev->info.num_axes); @@ -439,10 +523,13 @@ gdk_input_init (void) { GdkAxisUse axis; - gdkdev->orientation_axes[0] = axis_orientation[0]; - gdkdev->orientation_axes[1] = axis_orientation[1]; + gdkdev->orientation_axes[0] = axis_or[0]; + gdkdev->orientation_axes[1] = axis_or[1]; for (axis = GDK_AXIS_XTILT; axis <= GDK_AXIS_YTILT; axis++) { + /* Wintab gives us aximuth and altitude, which + * we convert to x and y tilt in the -1000..1000 range + */ gdkdev->axes[k].xresolution = gdkdev->axes[k].resolution = 1000; gdkdev->axes[k].xmin_value = @@ -457,13 +544,37 @@ gdk_input_init (void) gdkdev->info.num_keys = 0; gdkdev->info.keys = NULL; GDK_NOTE (EVENTS, - g_print ("gdk_input_init: device: %d axes: %d\n", - gdkdev->info.deviceid, - gdkdev->info.num_axes)); + (g_print ("device: %d (%d) %s axes: %d\n", + gdkdev->info.deviceid, cursorix, + gdkdev->info.name, + gdkdev->info.num_axes), + g_print ("axes: X:%d, Y:%d, PRESSURE:%d, " + "XTILT:%d, YTILT:%d\n", + gdkdev->axis_for_use[GDK_AXIS_X], + gdkdev->axis_for_use[GDK_AXIS_Y], + gdkdev->axis_for_use[GDK_AXIS_PRESSURE], + gdkdev->axis_for_use[GDK_AXIS_XTILT], + gdkdev->axis_for_use[GDK_AXIS_YTILT]))); + for (i = 0; i < gdkdev->info.num_axes; i++) + GDK_NOTE (EVENTS, + g_print ("...axis %d: %d--%d@%d (%d--%d@%d)\n", + i, + gdkdev->axes[i].xmin_value, + gdkdev->axes[i].xmax_value, + gdkdev->axes[i].xresolution, + gdkdev->axes[i].min_value, + gdkdev->axes[i].max_value, + gdkdev->axes[i].resolution)); gdk_input_devices = g_list_append (gdk_input_devices, gdkdev); } } + } +#endif /* HAVE_WINTAB */ + + if (deviceid_counter > 0) + { +#ifdef HAVE_WINTAB gdk_input_vtable.set_mode = gdk_input_win32_set_mode; gdk_input_vtable.set_axes = NULL; gdk_input_vtable.set_key = NULL; @@ -480,6 +591,9 @@ gdk_input_init (void) gdk_input_root_width = gdk_screen_width (); gdk_input_root_height = gdk_screen_height (); gdk_input_ignore_core = FALSE; +#else + g_assert_not_reached (); +#endif } else { @@ -501,21 +615,70 @@ gdk_input_init (void) gdk_input_devices = g_list_append (gdk_input_devices, &gdk_input_core_info); } +gint +gdk_input_set_mode (guint32 deviceid, + GdkInputMode mode) +{ + if (deviceid == GDK_CORE_POINTER) + return FALSE; + + if (gdk_input_vtable.set_mode) + return gdk_input_vtable.set_mode (deviceid, mode); + else + return FALSE; +} + +void +gdk_input_set_axes (guint32 deviceid, + GdkAxisUse *axes) +{ + int i; + GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid); + g_return_if_fail (gdkdev != NULL); + + if (deviceid == GDK_CORE_POINTER) + return; + + for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++) + { + gdkdev->axis_for_use[i] = -1; + } + + for (i = 0; i < gdkdev->info.num_axes; i++) + { + gdkdev->info.axes[i] = axes[i]; + gdkdev->axis_for_use[axes[i]] = i; + } +} + static void -gdk_input_get_root_relative_geometry (HWND w, - int *x_ret, - int *y_ret) +gdk_input_none_get_pointer (GdkWindow *window, + guint32 deviceid, + gdouble *x, + gdouble *y, + gdouble *pressure, + gdouble *xtilt, + gdouble *ytilt, + GdkModifierType *mask) { - RECT rect; + gint x_int, y_int; - GetWindowRect (w, &rect); + gdk_window_get_pointer (window, &x_int, &y_int, mask); - if (x_ret) - *x_ret = rect.left; - if (y_ret) - *y_ret = rect.top; + if (x) + *x = x_int; + if (y) + *y = y_int; + if (pressure) + *pressure = 0.5; + if (xtilt) + *xtilt = 0; + if (ytilt) + *ytilt = 0; } +#ifdef HAVE_WINTAB + static void gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev, GdkInputWindow *input_window, @@ -625,42 +788,6 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev, } } -gint -gdk_input_set_mode (guint32 deviceid, - GdkInputMode mode) -{ - if (deviceid == GDK_CORE_POINTER) - return FALSE; - - if (gdk_input_vtable.set_mode) - return gdk_input_vtable.set_mode (deviceid, mode); - else - return FALSE; -} - -void -gdk_input_set_axes (guint32 deviceid, - GdkAxisUse *axes) -{ - int i; - GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid); - g_return_if_fail (gdkdev != NULL); - - if (deviceid == GDK_CORE_POINTER) - return; - - for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++) - { - gdkdev->axis_for_use[i] = -1; - } - - for (i = 0; i < gdkdev->info.num_axes; i++) - { - gdkdev->info.axes[i] = axes[i]; - gdkdev->axis_for_use[axes[i]] = i; - } -} - static void gdk_input_win32_get_pointer (GdkWindow *window, guint32 deviceid, @@ -714,29 +841,18 @@ gdk_input_win32_get_pointer (GdkWindow *window, } static void -gdk_input_none_get_pointer (GdkWindow *window, - guint32 deviceid, - gdouble *x, - gdouble *y, - gdouble *pressure, - gdouble *xtilt, - gdouble *ytilt, - GdkModifierType *mask) +gdk_input_get_root_relative_geometry (HWND w, + int *x_ret, + int *y_ret) { - gint x_int, y_int; + RECT rect; - gdk_window_get_pointer (window, &x_int, &y_int, mask); + GetWindowRect (w, &rect); - if (x) - *x = x_int; - if (y) - *y = y_int; - if (pressure) - *pressure = 0.5; - if (xtilt) - *xtilt = 0; - if (ytilt) - *ytilt = 0; + if (x_ret) + *x_ret = rect.left; + if (y_ret) + *y_ret = rect.top; } static gint @@ -850,6 +966,22 @@ decode_tilt (gint *axis_data, axis_data[1] = sin (az) * cos (el) * 1000; } +static GdkDevicePrivate * +gdk_input_find_dev_from_ctx (HCTX hctx, + UINT cursor) +{ + GList *tmp_list = gdk_input_devices; + GdkDevicePrivate *gdkdev; + + while (tmp_list) + { + gdkdev = (GdkDevicePrivate *) (tmp_list->data); + if (gdkdev->hctx == hctx && gdkdev->cursor == cursor) + return gdkdev; + tmp_list = tmp_list->next; + } + return NULL; +} static gint gdk_input_win32_other_event (GdkEvent *event, MSG *xevent) @@ -1021,13 +1153,14 @@ gdk_input_win32_other_event (GdkEvent *event, & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)); - GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g\n", + GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g %g,%g\n", (event->button.type == GDK_BUTTON_PRESS ? "press" : "release"), event->button.deviceid, event->button.button, event->button.x, event->button.y, - event->button.pressure)); + event->button.pressure, + event->button.xtilt, event->button.ytilt)); } else { @@ -1049,10 +1182,11 @@ gdk_input_win32_other_event (GdkEvent *event, | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)); - GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g\n", + GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g %g,%g\n", event->motion.deviceid, event->motion.x, event->motion.y, - event->motion.pressure)); + event->motion.pressure, + event->motion.xtilt, event->motion.ytilt)); /* Check for missing release or press events for the normal * pressure button. At least on my ArtPadII I sometimes miss a @@ -1114,7 +1248,6 @@ gdk_input_win32_other_event (GdkEvent *event, event->proximity.deviceid)); return TRUE; } - return FALSE; } @@ -1188,6 +1321,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window, if (gdkdev->info.deviceid != GDK_CORE_POINTER) { #if 0 + /* XXX */ gdk_input_find_events (window, gdkdev, event_mask, event_classes, &num_classes); @@ -1215,6 +1349,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window, ((gdkdev->button_state != 0) || need_ungrab)) { #if 0 + /* XXX */ XUngrabDevice (gdk_display, gdkdev->xdevice, time); #endif gdkdev->button_state = 0; @@ -1255,6 +1390,7 @@ gdk_input_win32_ungrab_pointer (guint32 time) { gdkdev = (GdkDevicePrivate *)tmp_list->data; #if 0 + /* XXX */ if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice) XUngrabDevice (gdk_display, gdkdev->xdevice, time); #endif @@ -1263,6 +1399,8 @@ gdk_input_win32_ungrab_pointer (guint32 time) } } +#endif /* HAVE_WINTAB */ + GList * gdk_input_list_devices (void) { @@ -1308,6 +1446,25 @@ gdk_input_motion_events (GdkWindow *window, return NULL; /* ??? */ } +static gint +gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) +{ + if (gdk_input_vtable.enable_window) + return gdk_input_vtable.enable_window (window, gdkdev); + else + return TRUE; +} + +static gint +gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) +{ + if (gdk_input_vtable.disable_window) + return gdk_input_vtable.disable_window(window,gdkdev); + else + return TRUE; +} + + static GdkInputWindow * gdk_input_window_find (GdkWindow *window) { @@ -1320,6 +1477,8 @@ gdk_input_window_find (GdkWindow *window) return NULL; /* Not found */ } +#if !USE_SYSCONTEXT + static GdkInputWindow * gdk_input_window_find_within (GdkWindow *window) { @@ -1346,6 +1505,8 @@ gdk_input_window_find_within (GdkWindow *window) return candidate; } +#endif + /* FIXME: this routine currently needs to be called between creation and the corresponding configure event (because it doesn't get the root_relative_geometry). This should work with @@ -1406,9 +1567,9 @@ gdk_input_set_extension_events (GdkWindow *window, { if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED && (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL)) - gdk_input_win32_enable_window (window, gdkdev); + gdk_input_enable_window (window, gdkdev); else - gdk_input_win32_disable_window (window, gdkdev); + gdk_input_disable_window (window, gdkdev); } } } @@ -1428,6 +1589,7 @@ gdk_input_window_destroy (GdkWindow *window) void gdk_input_exit (void) { +#ifdef HAVE_WINTAB GList *tmp_list; GdkDevicePrivate *gdkdev; @@ -1453,6 +1615,10 @@ gdk_input_exit (void) g_free (tmp_list->data); } g_list_free (gdk_input_windows); + gdk_input_windows = NULL; + + gdk_window_unref (wintab_window); + wintab_window = NULL; #if 1 for (tmp_list = wintab_contexts; tmp_list; tmp_list = tmp_list->next) @@ -1463,27 +1629,30 @@ gdk_input_exit (void) #ifdef _MSC_VER /* For some reason WTEnable and/or WTClose tend to crash here. * Protect with __try/__except to avoid a message box. + * When compiling with gcc, we cannot use __try/__except, so + * don't call WTClose. I think this means that we'll + * eventually run out of Wintab contexts, sigh. */ __try { -#endif /* _MSC_VER */ #if 0 WTEnable (*hctx, FALSE); #endif result = WTClose (*hctx); -#ifdef _MSC_VER } __except (/* GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? */ EXCEPTION_EXECUTE_HANDLER /*: EXCEPTION_CONTINUE_SEARCH */) { result = FALSE; } -#endif /* _MSC_VER */ if (!result) g_warning ("gdk_input_exit: Closing Wintab context %#x failed", *hctx); +#endif /* _MSC_VER */ g_free (hctx); } #endif g_list_free (wintab_contexts); + wintab_contexts = NULL; +#endif } static GdkDevicePrivate * @@ -1502,23 +1671,6 @@ gdk_input_find_device (guint32 id) return NULL; } -static GdkDevicePrivate * -gdk_input_find_dev_from_ctx (HCTX hctx, - UINT cursor) -{ - GList *tmp_list = gdk_input_devices; - GdkDevicePrivate *gdkdev; - - while (tmp_list) - { - gdkdev = (GdkDevicePrivate *) (tmp_list->data); - if (gdkdev->hctx == hctx && gdkdev->cursor == cursor) - return gdkdev; - tmp_list = tmp_list->next; - } - return NULL; -} - void gdk_input_window_get_pointer (GdkWindow *window, guint32 deviceid, diff --git a/gdk/win32/gdkinput.c b/gdk/win32/gdkinput.c index 70063a7a72..03ff326ead 100644 --- a/gdk/win32/gdkinput.c +++ b/gdk/win32/gdkinput.c @@ -33,8 +33,49 @@ #include #include "gdkx.h" + +#ifdef HAVE_WINTAB +#include +#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE | PK_ORIENTATION) +#define PACKETMODE (PK_BUTTONS) +#include +#endif + #include "gdkinput.h" +struct _GdkDevicePrivate { + GdkDeviceInfo info; + + /* information about the axes */ + GdkAxisInfo *axes; + + /* reverse lookup on axis use type */ + gint axis_for_use[GDK_AXIS_LAST]; + + /* true if we need to select a different set of events, but + * can't because this is the core pointer + */ + gint needs_update; + + /* State of buttons */ + gint button_state; + + gint *last_axis_data; + gint last_buttons; +#ifdef HAVE_WINTAB + /* WINTAB stuff: */ + HCTX hctx; + /* Cursor number */ + UINT cursor; + /* The cursor's CSR_PKTDATA */ + WTPKT pktdata; + /* CSR_NPBTNMARKS */ + UINT npbtnmarks[2]; + /* Azimuth and altitude axis */ + AXIS orientation_axes[2]; +#endif +}; + #ifndef M_PI #define M_PI 3.14159265358979323846 #endif @@ -47,12 +88,33 @@ * good at all. */ +#ifdef HAVE_WINTAB +#define DEBUG_WINTAB 1 +#endif + #define TWOPI (2.*M_PI) #define PING() g_print("%s: %d\n",__FILE__,__LINE__) /* Forward declarations */ +static gint gdk_input_enable_window (GdkWindow *window, + GdkDevicePrivate *gdkdev); +static gint gdk_input_disable_window (GdkWindow *window, + GdkDevicePrivate *gdkdev); +static void gdk_input_none_get_pointer (GdkWindow *window, + guint32 deviceid, + gdouble *x, + gdouble *y, + gdouble *pressure, + gdouble *xtilt, + gdouble *ytilt, + GdkModifierType *mask); + +static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid); + +#ifdef HAVE_WINTAB + static gint gdk_input_win32_set_mode (guint32 deviceid, GdkInputMode mode); static void gdk_input_win32_get_pointer (GdkWindow *window, @@ -63,14 +125,6 @@ static void gdk_input_win32_get_pointer (GdkWindow *window, gdouble *xtilt, gdouble *ytilt, GdkModifierType *mask); -static void gdk_input_none_get_pointer (GdkWindow *window, - guint32 deviceid, - gdouble *x, - gdouble *y, - gdouble *pressure, - gdouble *xtilt, - gdouble *ytilt, - GdkModifierType *mask); static gint gdk_input_win32_grab_pointer (GdkWindow * window, gint owner_events, GdkEventMask event_mask, @@ -89,10 +143,12 @@ static gint gdk_input_win32_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev); static GdkInputWindow *gdk_input_window_find (GdkWindow *window); +#if !USE_SYSCONTEXT static GdkInputWindow *gdk_input_window_find_within (GdkWindow *window); -static GdkDevicePrivate *gdk_input_find_device (guint32 deviceid); +#endif static GdkDevicePrivate *gdk_input_find_dev_from_ctx (HCTX hctx, UINT id); +#endif /* HAVE_WINTAB */ /* Local variables */ @@ -126,7 +182,7 @@ GdkInputVTable gdk_input_vtable; gint gdk_input_ignore_core; gint gdk_input_ignore_wintab = FALSE; -#if 0 +#if DEBUG_WINTAB static void print_lc(LOGCONTEXT *lc) @@ -228,6 +284,8 @@ print_lc(LOGCONTEXT *lc) void gdk_input_init (void) { + guint32 deviceid_counter = 0; +#ifdef HAVE_WINTAB GdkDevicePrivate *gdkdev; GdkWindowPrivate *window_private; GdkWindowAttr wa; @@ -235,10 +293,11 @@ gdk_input_init (void) LOGCONTEXT defcontext; HCTX *hctx; UINT ndevices, ncursors, ncsrtypes, firstcsr, hardware; - AXIS axis_x, axis_y, axis_npressure, axis_orientation[3]; + BOOL active; + AXIS axis_x, axis_y, axis_npressure, axis_or[3]; int i, j, k; + int devix, cursorix; char devname[100], csrname[100]; - guint32 deviceid_counter = 0; gdk_input_devices = NULL; wintab_contexts = NULL; @@ -247,18 +306,25 @@ gdk_input_init (void) WTInfo (0, 0, NULL)) { WTInfo (WTI_INTERFACE, IFC_SPECVERSION, &specversion); - + GDK_NOTE (MISC, g_print ("Wintab interface version %d.%d\n", + HIBYTE (specversion), LOBYTE (specversion))); #if USE_SYSCONTEXT WTInfo (WTI_DEFSYSCTX, 0, &defcontext); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("DEFSYSCTX:\n"), print_lc(&defcontext))); +#endif #else WTInfo (WTI_DEFCONTEXT, 0, &defcontext); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("DEFCONTEXT:\n"), print_lc(&defcontext))); #endif -#if 0 - g_print("DEFCONTEXT:\n"); print_lc(&defcontext); #endif WTInfo (WTI_INTERFACE, IFC_NDEVICES, &ndevices); WTInfo (WTI_INTERFACE, IFC_NCURSORS, &ncursors); - +#if DEBUG_WINTAB + GDK_NOTE (MISC, g_print ("NDEVICES: %d, NCURSORS: %d\n", + ndevices, ncursors)); +#endif /* Create a dummy window to receive wintab events */ wa.wclass = GDK_INPUT_OUTPUT; wa.event_mask = GDK_ALL_EVENTS_MASK; @@ -275,61 +341,64 @@ gdk_input_init (void) gdk_window_ref (wintab_window); window_private = (GdkWindowPrivate *) wintab_window; - for (i = 0; i < ndevices; i++) + for (devix = 0; devix < ndevices; devix++) { LOGCONTEXT lc; - WTInfo (WTI_DEVICES + i, DVC_NAME, devname); + WTInfo (WTI_DEVICES + devix, DVC_NAME, devname); - WTInfo (WTI_DEVICES + i, DVC_NCSRTYPES, &ncsrtypes); - WTInfo (WTI_DEVICES + i, DVC_FIRSTCSR, &firstcsr); - WTInfo (WTI_DEVICES + i, DVC_HARDWARE, &hardware); - WTInfo (WTI_DEVICES + i, DVC_X, &axis_x); - WTInfo (WTI_DEVICES + i, DVC_Y, &axis_y); - WTInfo (WTI_DEVICES + i, DVC_NPRESSURE, &axis_npressure); - WTInfo (WTI_DEVICES + i, DVC_ORIENTATION, axis_orientation); + WTInfo (WTI_DEVICES + devix, DVC_NCSRTYPES, &ncsrtypes); + WTInfo (WTI_DEVICES + devix, DVC_FIRSTCSR, &firstcsr); + WTInfo (WTI_DEVICES + devix, DVC_HARDWARE, &hardware); + WTInfo (WTI_DEVICES + devix, DVC_X, &axis_x); + WTInfo (WTI_DEVICES + devix, DVC_Y, &axis_y); + WTInfo (WTI_DEVICES + devix, DVC_NPRESSURE, &axis_npressure); + WTInfo (WTI_DEVICES + devix, DVC_ORIENTATION, axis_or); if (HIBYTE (specversion) > 1 || LOBYTE (specversion) >= 1) { - WTInfo (WTI_DDCTXS + i, CTX_NAME, lc.lcName); - WTInfo (WTI_DDCTXS + i, CTX_OPTIONS, &lc.lcOptions); + WTInfo (WTI_DDCTXS + devix, CTX_NAME, lc.lcName); + WTInfo (WTI_DDCTXS + devix, CTX_OPTIONS, &lc.lcOptions); lc.lcOptions |= CXO_MESSAGES; +#if USE_SYSCONTEXT + lc.lcOptions |= CXO_SYSTEM; +#endif lc.lcStatus = 0; - WTInfo (WTI_DDCTXS + i, CTX_LOCKS, &lc.lcLocks); + WTInfo (WTI_DDCTXS + devix, CTX_LOCKS, &lc.lcLocks); lc.lcMsgBase = WT_DEFBASE; - lc.lcDevice = i; - lc.lcPktRate = 20; + lc.lcDevice = devix; + lc.lcPktRate = 50; lc.lcPktData = PACKETDATA; lc.lcPktMode = PK_BUTTONS; /* We want buttons in relative mode */ lc.lcMoveMask = PACKETDATA; lc.lcBtnDnMask = lc.lcBtnUpMask = ~0; - WTInfo (WTI_DDCTXS + i, CTX_INORGX, &lc.lcInOrgX); - WTInfo (WTI_DDCTXS + i, CTX_INORGY, &lc.lcInOrgY); - WTInfo (WTI_DDCTXS + i, CTX_INORGZ, &lc.lcInOrgZ); - WTInfo (WTI_DDCTXS + i, CTX_INEXTX, &lc.lcInExtX); - WTInfo (WTI_DDCTXS + i, CTX_INEXTY, &lc.lcInExtY); - WTInfo (WTI_DDCTXS + i, CTX_INEXTZ, &lc.lcInExtZ); + WTInfo (WTI_DDCTXS + devix, CTX_INORGX, &lc.lcInOrgX); + WTInfo (WTI_DDCTXS + devix, CTX_INORGY, &lc.lcInOrgY); + WTInfo (WTI_DDCTXS + devix, CTX_INORGZ, &lc.lcInOrgZ); + WTInfo (WTI_DDCTXS + devix, CTX_INEXTX, &lc.lcInExtX); + WTInfo (WTI_DDCTXS + devix, CTX_INEXTY, &lc.lcInExtY); + WTInfo (WTI_DDCTXS + devix, CTX_INEXTZ, &lc.lcInExtZ); lc.lcOutOrgX = axis_x.axMin; lc.lcOutOrgY = axis_y.axMin; lc.lcOutExtX = axis_x.axMax - axis_x.axMin; lc.lcOutExtY = axis_y.axMax - axis_y.axMin; lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */ - WTInfo (WTI_DDCTXS + i, CTX_SENSX, &lc.lcSensX); - WTInfo (WTI_DDCTXS + i, CTX_SENSY, &lc.lcSensY); - WTInfo (WTI_DDCTXS + i, CTX_SENSZ, &lc.lcSensZ); - WTInfo (WTI_DDCTXS + i, CTX_SYSMODE, &lc.lcSysMode); + WTInfo (WTI_DDCTXS + devix, CTX_SENSX, &lc.lcSensX); + WTInfo (WTI_DDCTXS + devix, CTX_SENSY, &lc.lcSensY); + WTInfo (WTI_DDCTXS + devix, CTX_SENSZ, &lc.lcSensZ); + WTInfo (WTI_DDCTXS + devix, CTX_SYSMODE, &lc.lcSysMode); lc.lcSysOrgX = lc.lcSysOrgY = 0; - WTInfo (WTI_DDCTXS + i, CTX_SYSEXTX, &lc.lcSysExtX); - WTInfo (WTI_DDCTXS + i, CTX_SYSEXTY, &lc.lcSysExtY); - WTInfo (WTI_DDCTXS + i, CTX_SYSSENSX, &lc.lcSysSensX); - WTInfo (WTI_DDCTXS + i, CTX_SYSSENSY, &lc.lcSysSensY); + WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTX, &lc.lcSysExtX); + WTInfo (WTI_DDCTXS + devix, CTX_SYSEXTY, &lc.lcSysExtY); + WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSX, &lc.lcSysSensX); + WTInfo (WTI_DDCTXS + devix, CTX_SYSSENSY, &lc.lcSysSensY); } else { lc = defcontext; lc.lcOptions |= CXO_MESSAGES; lc.lcMsgBase = WT_DEFBASE; - lc.lcPktRate = 20; /* Slow down the packets a bit */ + lc.lcPktRate = 50; lc.lcPktData = PACKETDATA; lc.lcPktMode = PACKETMODE; lc.lcMoveMask = PACKETDATA; @@ -344,8 +413,9 @@ gdk_input_init (void) lc.lcOutExtY = -lc.lcOutExtY; /* We want Y growing downward */ #endif } -#if 0 - g_print("context for device %d:\n", i); print_lc(&lc); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("context for device %d:\n", devix), + print_lc(&lc))); #endif hctx = g_new (HCTX, 1); if ((*hctx = WTOpen (window_private->xwindow, &lc, TRUE)) == NULL) @@ -353,8 +423,8 @@ gdk_input_init (void) g_warning ("gdk_input_init: WTOpen failed"); return; } - GDK_NOTE (MISC, g_print ("gdk_input_init: opened Wintab device %d %#x\n", - i, *hctx)); + GDK_NOTE (MISC, g_print ("opened Wintab device %d %#x\n", + devix, *hctx)); wintab_contexts = g_list_append (wintab_contexts, hctx); #if 0 @@ -362,13 +432,18 @@ gdk_input_init (void) #endif WTOverlap (*hctx, TRUE); -#if 0 - g_print("context for device %d after WTOpen:\n", i); print_lc(&lc); +#if DEBUG_WINTAB + GDK_NOTE (MISC, (g_print("context for device %d after WTOpen:\n", devix), + print_lc(&lc))); #endif - for (j = firstcsr; j < firstcsr + ncsrtypes; j++) + for (cursorix = firstcsr; cursorix < firstcsr + ncsrtypes; cursorix++) { + active = FALSE; + WTInfo (WTI_CURSORS + cursorix, CSR_ACTIVE, &active); + if (!active) + continue; gdkdev = g_new (GdkDevicePrivate, 1); - WTInfo (WTI_CURSORS + j, CSR_NAME, csrname); + WTInfo (WTI_CURSORS + cursorix, CSR_NAME, csrname); gdkdev->info.name = g_strconcat (devname, " ", csrname, NULL); gdkdev->info.deviceid = deviceid_counter++; gdkdev->info.source = GDK_SOURCE_PEN; @@ -379,8 +454,8 @@ gdk_input_init (void) gdkdev->info.has_cursor = FALSE; #endif gdkdev->hctx = *hctx; - gdkdev->cursor = j; - WTInfo (WTI_CURSORS + j, CSR_PKTDATA, &gdkdev->pktdata); + gdkdev->cursor = cursorix; + WTInfo (WTI_CURSORS + cursorix, CSR_PKTDATA, &gdkdev->pktdata); gdkdev->info.num_axes = 0; if (gdkdev->pktdata & PK_X) gdkdev->info.num_axes++; @@ -388,9 +463,18 @@ gdk_input_init (void) gdkdev->info.num_axes++; if (gdkdev->pktdata & PK_NORMAL_PRESSURE) gdkdev->info.num_axes++; + /* The wintab driver for the Wacom ArtPad II reports + * PK_ORIENTATION in CSR_PKTDATA, but the tablet doesn't + * actually sense tilt. Catch this by noticing that the + * orientation axis's azimuth resolution is zero. + */ + if ((gdkdev->pktdata & PK_ORIENTATION) + && axis_or[0].axResolution == 0) + gdkdev->pktdata &= ~PK_ORIENTATION; + if (gdkdev->pktdata & PK_ORIENTATION) gdkdev->info.num_axes += 2; /* x and y tilt */ - WTInfo (WTI_CURSORS + j, CSR_NPBTNMARKS, &gdkdev->npbtnmarks); + WTInfo (WTI_CURSORS + cursorix, CSR_NPBTNMARKS, &gdkdev->npbtnmarks); gdkdev->axes = g_new (GdkAxisInfo, gdkdev->info.num_axes); gdkdev->info.axes = g_new (GdkAxisUse, gdkdev->info.num_axes); gdkdev->last_axis_data = g_new (gint, gdkdev->info.num_axes); @@ -439,10 +523,13 @@ gdk_input_init (void) { GdkAxisUse axis; - gdkdev->orientation_axes[0] = axis_orientation[0]; - gdkdev->orientation_axes[1] = axis_orientation[1]; + gdkdev->orientation_axes[0] = axis_or[0]; + gdkdev->orientation_axes[1] = axis_or[1]; for (axis = GDK_AXIS_XTILT; axis <= GDK_AXIS_YTILT; axis++) { + /* Wintab gives us aximuth and altitude, which + * we convert to x and y tilt in the -1000..1000 range + */ gdkdev->axes[k].xresolution = gdkdev->axes[k].resolution = 1000; gdkdev->axes[k].xmin_value = @@ -457,13 +544,37 @@ gdk_input_init (void) gdkdev->info.num_keys = 0; gdkdev->info.keys = NULL; GDK_NOTE (EVENTS, - g_print ("gdk_input_init: device: %d axes: %d\n", - gdkdev->info.deviceid, - gdkdev->info.num_axes)); + (g_print ("device: %d (%d) %s axes: %d\n", + gdkdev->info.deviceid, cursorix, + gdkdev->info.name, + gdkdev->info.num_axes), + g_print ("axes: X:%d, Y:%d, PRESSURE:%d, " + "XTILT:%d, YTILT:%d\n", + gdkdev->axis_for_use[GDK_AXIS_X], + gdkdev->axis_for_use[GDK_AXIS_Y], + gdkdev->axis_for_use[GDK_AXIS_PRESSURE], + gdkdev->axis_for_use[GDK_AXIS_XTILT], + gdkdev->axis_for_use[GDK_AXIS_YTILT]))); + for (i = 0; i < gdkdev->info.num_axes; i++) + GDK_NOTE (EVENTS, + g_print ("...axis %d: %d--%d@%d (%d--%d@%d)\n", + i, + gdkdev->axes[i].xmin_value, + gdkdev->axes[i].xmax_value, + gdkdev->axes[i].xresolution, + gdkdev->axes[i].min_value, + gdkdev->axes[i].max_value, + gdkdev->axes[i].resolution)); gdk_input_devices = g_list_append (gdk_input_devices, gdkdev); } } + } +#endif /* HAVE_WINTAB */ + + if (deviceid_counter > 0) + { +#ifdef HAVE_WINTAB gdk_input_vtable.set_mode = gdk_input_win32_set_mode; gdk_input_vtable.set_axes = NULL; gdk_input_vtable.set_key = NULL; @@ -480,6 +591,9 @@ gdk_input_init (void) gdk_input_root_width = gdk_screen_width (); gdk_input_root_height = gdk_screen_height (); gdk_input_ignore_core = FALSE; +#else + g_assert_not_reached (); +#endif } else { @@ -501,21 +615,70 @@ gdk_input_init (void) gdk_input_devices = g_list_append (gdk_input_devices, &gdk_input_core_info); } +gint +gdk_input_set_mode (guint32 deviceid, + GdkInputMode mode) +{ + if (deviceid == GDK_CORE_POINTER) + return FALSE; + + if (gdk_input_vtable.set_mode) + return gdk_input_vtable.set_mode (deviceid, mode); + else + return FALSE; +} + +void +gdk_input_set_axes (guint32 deviceid, + GdkAxisUse *axes) +{ + int i; + GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid); + g_return_if_fail (gdkdev != NULL); + + if (deviceid == GDK_CORE_POINTER) + return; + + for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++) + { + gdkdev->axis_for_use[i] = -1; + } + + for (i = 0; i < gdkdev->info.num_axes; i++) + { + gdkdev->info.axes[i] = axes[i]; + gdkdev->axis_for_use[axes[i]] = i; + } +} + static void -gdk_input_get_root_relative_geometry (HWND w, - int *x_ret, - int *y_ret) +gdk_input_none_get_pointer (GdkWindow *window, + guint32 deviceid, + gdouble *x, + gdouble *y, + gdouble *pressure, + gdouble *xtilt, + gdouble *ytilt, + GdkModifierType *mask) { - RECT rect; + gint x_int, y_int; - GetWindowRect (w, &rect); + gdk_window_get_pointer (window, &x_int, &y_int, mask); - if (x_ret) - *x_ret = rect.left; - if (y_ret) - *y_ret = rect.top; + if (x) + *x = x_int; + if (y) + *y = y_int; + if (pressure) + *pressure = 0.5; + if (xtilt) + *xtilt = 0; + if (ytilt) + *ytilt = 0; } +#ifdef HAVE_WINTAB + static void gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev, GdkInputWindow *input_window, @@ -625,42 +788,6 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev, } } -gint -gdk_input_set_mode (guint32 deviceid, - GdkInputMode mode) -{ - if (deviceid == GDK_CORE_POINTER) - return FALSE; - - if (gdk_input_vtable.set_mode) - return gdk_input_vtable.set_mode (deviceid, mode); - else - return FALSE; -} - -void -gdk_input_set_axes (guint32 deviceid, - GdkAxisUse *axes) -{ - int i; - GdkDevicePrivate *gdkdev = gdk_input_find_device (deviceid); - g_return_if_fail (gdkdev != NULL); - - if (deviceid == GDK_CORE_POINTER) - return; - - for (i = GDK_AXIS_IGNORE; i < GDK_AXIS_LAST; i++) - { - gdkdev->axis_for_use[i] = -1; - } - - for (i = 0; i < gdkdev->info.num_axes; i++) - { - gdkdev->info.axes[i] = axes[i]; - gdkdev->axis_for_use[axes[i]] = i; - } -} - static void gdk_input_win32_get_pointer (GdkWindow *window, guint32 deviceid, @@ -714,29 +841,18 @@ gdk_input_win32_get_pointer (GdkWindow *window, } static void -gdk_input_none_get_pointer (GdkWindow *window, - guint32 deviceid, - gdouble *x, - gdouble *y, - gdouble *pressure, - gdouble *xtilt, - gdouble *ytilt, - GdkModifierType *mask) +gdk_input_get_root_relative_geometry (HWND w, + int *x_ret, + int *y_ret) { - gint x_int, y_int; + RECT rect; - gdk_window_get_pointer (window, &x_int, &y_int, mask); + GetWindowRect (w, &rect); - if (x) - *x = x_int; - if (y) - *y = y_int; - if (pressure) - *pressure = 0.5; - if (xtilt) - *xtilt = 0; - if (ytilt) - *ytilt = 0; + if (x_ret) + *x_ret = rect.left; + if (y_ret) + *y_ret = rect.top; } static gint @@ -850,6 +966,22 @@ decode_tilt (gint *axis_data, axis_data[1] = sin (az) * cos (el) * 1000; } +static GdkDevicePrivate * +gdk_input_find_dev_from_ctx (HCTX hctx, + UINT cursor) +{ + GList *tmp_list = gdk_input_devices; + GdkDevicePrivate *gdkdev; + + while (tmp_list) + { + gdkdev = (GdkDevicePrivate *) (tmp_list->data); + if (gdkdev->hctx == hctx && gdkdev->cursor == cursor) + return gdkdev; + tmp_list = tmp_list->next; + } + return NULL; +} static gint gdk_input_win32_other_event (GdkEvent *event, MSG *xevent) @@ -1021,13 +1153,14 @@ gdk_input_win32_other_event (GdkEvent *event, & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)); - GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g\n", + GDK_NOTE (EVENTS, g_print ("WINTAB button %s: %d %d %g,%g %g %g,%g\n", (event->button.type == GDK_BUTTON_PRESS ? "press" : "release"), event->button.deviceid, event->button.button, event->button.x, event->button.y, - event->button.pressure)); + event->button.pressure, + event->button.xtilt, event->button.ytilt)); } else { @@ -1049,10 +1182,11 @@ gdk_input_win32_other_event (GdkEvent *event, | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)); - GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g\n", + GDK_NOTE (EVENTS, g_print ("WINTAB motion: %d %g,%g %g %g,%g\n", event->motion.deviceid, event->motion.x, event->motion.y, - event->motion.pressure)); + event->motion.pressure, + event->motion.xtilt, event->motion.ytilt)); /* Check for missing release or press events for the normal * pressure button. At least on my ArtPadII I sometimes miss a @@ -1114,7 +1248,6 @@ gdk_input_win32_other_event (GdkEvent *event, event->proximity.deviceid)); return TRUE; } - return FALSE; } @@ -1188,6 +1321,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window, if (gdkdev->info.deviceid != GDK_CORE_POINTER) { #if 0 + /* XXX */ gdk_input_find_events (window, gdkdev, event_mask, event_classes, &num_classes); @@ -1215,6 +1349,7 @@ gdk_input_win32_grab_pointer (GdkWindow *window, ((gdkdev->button_state != 0) || need_ungrab)) { #if 0 + /* XXX */ XUngrabDevice (gdk_display, gdkdev->xdevice, time); #endif gdkdev->button_state = 0; @@ -1255,6 +1390,7 @@ gdk_input_win32_ungrab_pointer (guint32 time) { gdkdev = (GdkDevicePrivate *)tmp_list->data; #if 0 + /* XXX */ if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice) XUngrabDevice (gdk_display, gdkdev->xdevice, time); #endif @@ -1263,6 +1399,8 @@ gdk_input_win32_ungrab_pointer (guint32 time) } } +#endif /* HAVE_WINTAB */ + GList * gdk_input_list_devices (void) { @@ -1308,6 +1446,25 @@ gdk_input_motion_events (GdkWindow *window, return NULL; /* ??? */ } +static gint +gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) +{ + if (gdk_input_vtable.enable_window) + return gdk_input_vtable.enable_window (window, gdkdev); + else + return TRUE; +} + +static gint +gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) +{ + if (gdk_input_vtable.disable_window) + return gdk_input_vtable.disable_window(window,gdkdev); + else + return TRUE; +} + + static GdkInputWindow * gdk_input_window_find (GdkWindow *window) { @@ -1320,6 +1477,8 @@ gdk_input_window_find (GdkWindow *window) return NULL; /* Not found */ } +#if !USE_SYSCONTEXT + static GdkInputWindow * gdk_input_window_find_within (GdkWindow *window) { @@ -1346,6 +1505,8 @@ gdk_input_window_find_within (GdkWindow *window) return candidate; } +#endif + /* FIXME: this routine currently needs to be called between creation and the corresponding configure event (because it doesn't get the root_relative_geometry). This should work with @@ -1406,9 +1567,9 @@ gdk_input_set_extension_events (GdkWindow *window, { if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED && (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL)) - gdk_input_win32_enable_window (window, gdkdev); + gdk_input_enable_window (window, gdkdev); else - gdk_input_win32_disable_window (window, gdkdev); + gdk_input_disable_window (window, gdkdev); } } } @@ -1428,6 +1589,7 @@ gdk_input_window_destroy (GdkWindow *window) void gdk_input_exit (void) { +#ifdef HAVE_WINTAB GList *tmp_list; GdkDevicePrivate *gdkdev; @@ -1453,6 +1615,10 @@ gdk_input_exit (void) g_free (tmp_list->data); } g_list_free (gdk_input_windows); + gdk_input_windows = NULL; + + gdk_window_unref (wintab_window); + wintab_window = NULL; #if 1 for (tmp_list = wintab_contexts; tmp_list; tmp_list = tmp_list->next) @@ -1463,27 +1629,30 @@ gdk_input_exit (void) #ifdef _MSC_VER /* For some reason WTEnable and/or WTClose tend to crash here. * Protect with __try/__except to avoid a message box. + * When compiling with gcc, we cannot use __try/__except, so + * don't call WTClose. I think this means that we'll + * eventually run out of Wintab contexts, sigh. */ __try { -#endif /* _MSC_VER */ #if 0 WTEnable (*hctx, FALSE); #endif result = WTClose (*hctx); -#ifdef _MSC_VER } __except (/* GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? */ EXCEPTION_EXECUTE_HANDLER /*: EXCEPTION_CONTINUE_SEARCH */) { result = FALSE; } -#endif /* _MSC_VER */ if (!result) g_warning ("gdk_input_exit: Closing Wintab context %#x failed", *hctx); +#endif /* _MSC_VER */ g_free (hctx); } #endif g_list_free (wintab_contexts); + wintab_contexts = NULL; +#endif } static GdkDevicePrivate * @@ -1502,23 +1671,6 @@ gdk_input_find_device (guint32 id) return NULL; } -static GdkDevicePrivate * -gdk_input_find_dev_from_ctx (HCTX hctx, - UINT cursor) -{ - GList *tmp_list = gdk_input_devices; - GdkDevicePrivate *gdkdev; - - while (tmp_list) - { - gdkdev = (GdkDevicePrivate *) (tmp_list->data); - if (gdkdev->hctx == hctx && gdkdev->cursor == cursor) - return gdkdev; - tmp_list = tmp_list->next; - } - return NULL; -} - void gdk_input_window_get_pointer (GdkWindow *window, guint32 deviceid, diff --git a/gdk/win32/gdkinput.h b/gdk/win32/gdkinput.h index 46e6b1f643..aa4a02dc6c 100644 --- a/gdk/win32/gdkinput.h +++ b/gdk/win32/gdkinput.h @@ -27,11 +27,6 @@ #ifndef __GDK_INPUT_H__ #define __GDK_INPUT_H__ -#include -#define PACKETDATA (PK_CONTEXT | PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE | PK_ORIENTATION) -#define PACKETMODE (PK_BUTTONS) -#include - typedef struct _GdkAxisInfo GdkAxisInfo; typedef struct _GdkInputVTable GdkInputVTable; typedef struct _GdkDevicePrivate GdkDevicePrivate; @@ -89,40 +84,6 @@ struct _GdkAxisInfo gint min_value, max_value; }; -#define GDK_INPUT_NUM_EVENTC 6 - -struct _GdkDevicePrivate { - GdkDeviceInfo info; - - /* information about the axes */ - GdkAxisInfo *axes; - - /* reverse lookup on axis use type */ - gint axis_for_use[GDK_AXIS_LAST]; - - /* true if we need to select a different set of events, but - * can't because this is the core pointer - */ - gint needs_update; - - /* State of buttons */ - gint button_state; - - gint *last_axis_data; - gint last_buttons; - - /* WINTAB stuff: */ - HCTX hctx; - /* Cursor number */ - UINT cursor; - /* The cursor's CSR_PKTDATA */ - WTPKT pktdata; - /* CSR_NPBTNMARKS */ - UINT npbtnmarks[2]; - /* Azimuth and altitude axis */ - AXIS orientation_axes[2]; -}; - struct _GdkInputWindow { /* gdk window */ diff --git a/gdk/win32/gdkvisual-win32.c b/gdk/win32/gdkvisual-win32.c index 70f513c4e0..f274117954 100644 --- a/gdk/win32/gdkvisual-win32.c +++ b/gdk/win32/gdkvisual-win32.c @@ -29,24 +29,15 @@ #include #include "gdkx.h" -static void gdk_visual_add (GdkVisual *visual); static void gdk_visual_decompose_mask (gulong mask, gint *shift, gint *prec); -static guint gdk_visual_hash (Visual *key); -static gint gdk_visual_compare (Visual *a, - Visual *b); - static GdkVisualPrivate *system_visual; -static GdkVisualPrivate *visuals; -static gint nvisuals; -static gint available_depths[7]; -static gint navailable_depths; +static gint available_depths[1]; -static GdkVisualType available_types[6]; -static gint navailable_types; +static GdkVisualType available_types[1]; #ifdef G_ENABLE_DEBUG @@ -62,8 +53,6 @@ static const gchar* visual_names[] = #endif /* G_ENABLE_DEBUG */ -static GHashTable *visual_hash = NULL; - void gdk_visual_init (void) { @@ -94,242 +83,156 @@ gdk_visual_init (void) int rastercaps, numcolors, sizepalette, colorres, bitspixel; Visual *default_xvisual; - GdkVisualPrivate temp_visual; - int nxvisuals; - int i, j; - nxvisuals = 1; - visuals = g_new (GdkVisualPrivate, nxvisuals); + system_visual = g_new (GdkVisualPrivate, 1); + + bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL); + rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS); + default_xvisual = g_new (Visual, 1); + system_visual->xvisual = default_xvisual; + system_visual->xvisual->visualid = 0; + system_visual->xvisual->bitspixel = bitspixel; - nvisuals = 0; - for (i = 0; i < nxvisuals; i++) + if (rastercaps & RC_PALETTE) + { + system_visual->visual.type = GDK_VISUAL_PSEUDO_COLOR; + numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS); + sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE); + colorres = GetDeviceCaps (gdk_DC, COLORRES); + system_visual->xvisual->map_entries = sizepalette; + } + else if (bitspixel == 1) + { + system_visual->visual.type = GDK_VISUAL_STATIC_GRAY; + system_visual->xvisual->map_entries = 2; + } + else if (bitspixel == 4) + { + system_visual->visual.type = GDK_VISUAL_STATIC_COLOR; + system_visual->xvisual->map_entries = 16; + } + else if (bitspixel == 8) + { + system_visual->visual.type = GDK_VISUAL_STATIC_COLOR; + system_visual->xvisual->map_entries = 256; + } + else if (bitspixel == 16) { - if (1) + system_visual->visual.type = GDK_VISUAL_TRUE_COLOR; +#if 1 + /* This code by Mike Enright, + * see http://www.users.cts.com/sd/m/menright/display.html + */ + memset (&bmi, 0, sizeof (bmi)); + bmi.bi.biSize = sizeof (bmi.bi); + + hbm = CreateCompatibleBitmap (gdk_DC, 1, 1); + GetDIBits (gdk_DC, hbm, 0, 1, NULL, + (BITMAPINFO *) &bmi, DIB_RGB_COLORS); + GetDIBits (gdk_DC, hbm, 0, 1, NULL, + (BITMAPINFO *) &bmi, DIB_RGB_COLORS); + DeleteObject (hbm); + + if (bmi.bi.biCompression != BI_BITFIELDS) { - bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL); - rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS); - default_xvisual = g_new (Visual, 1); - visuals[nvisuals].xvisual = default_xvisual; - visuals[nvisuals].xvisual->visualid = nvisuals; - visuals[nvisuals].xvisual->bitspixel = bitspixel; - - if (rastercaps & RC_PALETTE) + /* Either BI_RGB or BI_RLE_something + * .... or perhaps (!!) something else. + * Theoretically biCompression might be + * mmioFourCC('c','v','i','d') but I doubt it. + */ + if (bmi.bi.biCompression == BI_RGB) { - visuals[nvisuals].visual.type = GDK_VISUAL_PSEUDO_COLOR; - numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS); - sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE); - colorres = GetDeviceCaps (gdk_DC, COLORRES); - visuals[nvisuals].xvisual->map_entries = sizepalette; + /* It's 555 */ + bitspixel = 15; + system_visual->visual.red_mask = 0x00007C00; + system_visual->visual.green_mask = 0x000003E0; + system_visual->visual.blue_mask = 0x0000001F; } - else if (bitspixel == 1) - { - visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_GRAY; - visuals[nvisuals].xvisual->map_entries = 2; - } - else if (bitspixel == 4) + else { - visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR; - visuals[nvisuals].xvisual->map_entries = 16; + g_assert_not_reached (); } - else if (bitspixel == 8) + } + else + { + DWORD allmasks = + bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2]; + int k = 0; + while (allmasks) { - visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR; - visuals[nvisuals].xvisual->map_entries = 256; + if (allmasks&1) + k++; + allmasks/=2; } - else if (bitspixel == 16) - { - visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR; -#if 1 - /* This code by Mike Enright, - * see http://www.users.cts.com/sd/m/menright/display.html - */ - memset (&bmi, 0, sizeof (bmi)); - bmi.bi.biSize = sizeof (bmi.bi); - - hbm = CreateCompatibleBitmap (gdk_DC, 1, 1); - GetDIBits (gdk_DC, hbm, 0, 1, NULL, - (BITMAPINFO *) &bmi, DIB_RGB_COLORS); - GetDIBits (gdk_DC, hbm, 0, 1, NULL, - (BITMAPINFO *) &bmi, DIB_RGB_COLORS); - DeleteObject (hbm); - - if (bmi.bi.biCompression != BI_BITFIELDS) - { - /* Either BI_RGB or BI_RLE_something - * .... or perhaps (!!) something else. - * Theoretically biCompression might be - * mmioFourCC('c','v','i','d') but I doubt it. - */ - if (bmi.bi.biCompression == BI_RGB) - { - /* It's 555 */ - bitspixel = 15; - visuals[nvisuals].visual.red_mask = 0x00007C00; - visuals[nvisuals].visual.green_mask = 0x000003E0; - visuals[nvisuals].visual.blue_mask = 0x0000001F; - } - else - { - g_assert_not_reached (); - } - } - else - { - DWORD allmasks = - bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2]; - int k = 0; - while (allmasks) - { - if (allmasks&1) - k++; - allmasks/=2; - } - bitspixel = k; - visuals[nvisuals].visual.red_mask = bmi.u.fields[0]; - visuals[nvisuals].visual.green_mask = bmi.u.fields[1]; - visuals[nvisuals].visual.blue_mask = bmi.u.fields[2]; - } + bitspixel = k; + system_visual->visual.red_mask = bmi.u.fields[0]; + system_visual->visual.green_mask = bmi.u.fields[1]; + system_visual->visual.blue_mask = bmi.u.fields[2]; + } #else - /* Old, incorrect (but still working) code. */ + /* Old, incorrect (but still working) code. */ #if 0 - visuals[nvisuals].visual.red_mask = 0x0000F800; - visuals[nvisuals].visual.green_mask = 0x000007E0; - visuals[nvisuals].visual.blue_mask = 0x0000001F; + system_visual->visual.red_mask = 0x0000F800; + system_visual->visual.green_mask = 0x000007E0; + system_visual->visual.blue_mask = 0x0000001F; #else - visuals[nvisuals].visual.red_mask = 0x00007C00; - visuals[nvisuals].visual.green_mask = 0x000003E0; - visuals[nvisuals].visual.blue_mask = 0x0000001F; + system_visual->visual.red_mask = 0x00007C00; + system_visual->visual.green_mask = 0x000003E0; + system_visual->visual.blue_mask = 0x0000001F; #endif #endif - } - else if (bitspixel == 24 || bitspixel == 32) - { - visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR; - visuals[nvisuals].visual.red_mask = 0x00FF0000; - visuals[nvisuals].visual.green_mask = 0x0000FF00; - visuals[nvisuals].visual.blue_mask = 0x000000FF; - } - else - g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel); - - visuals[nvisuals].visual.depth = bitspixel; - visuals[nvisuals].visual.byte_order = GDK_LSB_FIRST; - visuals[nvisuals].visual.bits_per_rgb = 42; /* Not used? */ - - if ((visuals[nvisuals].visual.type == GDK_VISUAL_TRUE_COLOR) || - (visuals[nvisuals].visual.type == GDK_VISUAL_DIRECT_COLOR)) - { - gdk_visual_decompose_mask (visuals[nvisuals].visual.red_mask, - &visuals[nvisuals].visual.red_shift, - &visuals[nvisuals].visual.red_prec); - - gdk_visual_decompose_mask (visuals[nvisuals].visual.green_mask, - &visuals[nvisuals].visual.green_shift, - &visuals[nvisuals].visual.green_prec); - - gdk_visual_decompose_mask (visuals[nvisuals].visual.blue_mask, - &visuals[nvisuals].visual.blue_shift, - &visuals[nvisuals].visual.blue_prec); - visuals[nvisuals].xvisual->map_entries = - 1 << (MAX (visuals[nvisuals].visual.red_prec, - MAX (visuals[nvisuals].visual.green_prec, - visuals[nvisuals].visual.blue_prec))); - } - else - { - visuals[nvisuals].visual.red_mask = 0; - visuals[nvisuals].visual.red_shift = 0; - visuals[nvisuals].visual.red_prec = 0; - - visuals[nvisuals].visual.green_mask = 0; - visuals[nvisuals].visual.green_shift = 0; - visuals[nvisuals].visual.green_prec = 0; - - visuals[nvisuals].visual.blue_mask = 0; - visuals[nvisuals].visual.blue_shift = 0; - visuals[nvisuals].visual.blue_prec = 0; - } - visuals[nvisuals].visual.colormap_size = visuals[nvisuals].xvisual->map_entries; - - nvisuals += 1; - } } - - for (i = 0; i < nvisuals; i++) + else if (bitspixel == 24 || bitspixel == 32) { - for (j = i+1; j < nvisuals; j++) - { - if (visuals[j].visual.depth >= visuals[i].visual.depth) - { - if ((visuals[j].visual.depth == 8) && (visuals[i].visual.depth == 8)) - { - if (visuals[j].visual.type == GDK_VISUAL_PSEUDO_COLOR) - { - temp_visual = visuals[j]; - visuals[j] = visuals[i]; - visuals[i] = temp_visual; - } - else if ((visuals[i].visual.type != GDK_VISUAL_PSEUDO_COLOR) && - visuals[j].visual.type > visuals[i].visual.type) - { - temp_visual = visuals[j]; - visuals[j] = visuals[i]; - visuals[i] = temp_visual; - } - } - else if ((visuals[j].visual.depth > visuals[i].visual.depth) || - ((visuals[j].visual.depth == visuals[i].visual.depth) && - (visuals[j].visual.type > visuals[i].visual.type))) - { - temp_visual = visuals[j]; - visuals[j] = visuals[i]; - visuals[i] = temp_visual; - } - } - } + system_visual->visual.type = GDK_VISUAL_TRUE_COLOR; + system_visual->visual.red_mask = 0x00FF0000; + system_visual->visual.green_mask = 0x0000FF00; + system_visual->visual.blue_mask = 0x000000FF; } + else + g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel); - for (i = 0; i < nvisuals; i++) - if (default_xvisual->visualid == visuals[i].xvisual->visualid) - { - system_visual = &visuals[i]; - break; - } + system_visual->visual.depth = bitspixel; + system_visual->visual.byte_order = GDK_LSB_FIRST; + system_visual->visual.bits_per_rgb = 42; /* Not used? */ - navailable_depths = 0; - for (i = 0; i < npossible_depths; i++) + if ((system_visual->visual.type == GDK_VISUAL_TRUE_COLOR) || + (system_visual->visual.type == GDK_VISUAL_DIRECT_COLOR)) { - for (j = 0; j < nvisuals; j++) - { - if (visuals[j].visual.depth == possible_depths[i]) - { - available_depths[navailable_depths++] = visuals[j].visual.depth; - break; - } - } + gdk_visual_decompose_mask (system_visual->visual.red_mask, + &system_visual->visual.red_shift, + &system_visual->visual.red_prec); + + gdk_visual_decompose_mask (system_visual->visual.green_mask, + &system_visual->visual.green_shift, + &system_visual->visual.green_prec); + + gdk_visual_decompose_mask (system_visual->visual.blue_mask, + &system_visual->visual.blue_shift, + &system_visual->visual.blue_prec); + system_visual->xvisual->map_entries = + 1 << (MAX (system_visual->visual.red_prec, + MAX (system_visual->visual.green_prec, + system_visual->visual.blue_prec))); } + else + { + system_visual->visual.red_mask = 0; + system_visual->visual.red_shift = 0; + system_visual->visual.red_prec = 0; - if (navailable_depths == 0) - g_error ("unable to find a usable depth"); + system_visual->visual.green_mask = 0; + system_visual->visual.green_shift = 0; + system_visual->visual.green_prec = 0; - navailable_types = 0; - for (i = 0; i < npossible_types; i++) - { - for (j = 0; j < nvisuals; j++) - { - if (visuals[j].visual.type == possible_types[i]) - { - available_types[navailable_types++] = visuals[j].visual.type; - break; - } - } + system_visual->visual.blue_mask = 0; + system_visual->visual.blue_shift = 0; + system_visual->visual.blue_prec = 0; } + system_visual->visual.colormap_size = system_visual->xvisual->map_entries; - for (i = 0; i < nvisuals; i++) - gdk_visual_add ((GdkVisual*) &visuals[i]); - - if (npossible_types == 0) - g_error ("unable to find a usable visual type"); + available_depths[0] = system_visual->visual.depth; + available_types[0] = system_visual->visual.type; } GdkVisual* @@ -365,67 +268,43 @@ gdk_visual_get_system (void) GdkVisual* gdk_visual_get_best (void) { - return ((GdkVisual*) &(visuals[0])); + return ((GdkVisual*) system_visual); } GdkVisual* gdk_visual_get_best_with_depth (gint depth) { - GdkVisual *return_val; - int i; - - return_val = NULL; - for (i = 0; i < nvisuals; i++) - if (depth == visuals[i].visual.depth) - { - return_val = (GdkVisual*) &(visuals[i]); - break; - } - - return return_val; + if (depth == system_visual->visual.depth) + return (GdkVisual*) system_visual; + else + return NULL; } GdkVisual* gdk_visual_get_best_with_type (GdkVisualType visual_type) { - GdkVisual *return_val; - int i; - - return_val = NULL; - for (i = 0; i < nvisuals; i++) - if (visual_type == visuals[i].visual.type) - { - return_val = (GdkVisual*) &(visuals[i]); - break; - } - - return return_val; + if (visual_type == system_visual->visual.type) + return (GdkVisual*) system_visual; + else + return NULL; } GdkVisual* gdk_visual_get_best_with_both (gint depth, GdkVisualType visual_type) { - GdkVisual *return_val; - int i; - - return_val = NULL; - for (i = 0; i < nvisuals; i++) - if ((depth == visuals[i].visual.depth) && - (visual_type == visuals[i].visual.type)) - { - return_val = (GdkVisual*) &(visuals[i]); - break; - } - - return return_val; + if ((depth == system_visual->visual.depth) && + (visual_type == system_visual->visual.type)) + return (GdkVisual*) system_visual; + else + return NULL; } void gdk_query_depths (gint **depths, gint *count) { - *count = navailable_depths; + *count = 1; *depths = available_depths; } @@ -433,59 +312,32 @@ void gdk_query_visual_types (GdkVisualType **visual_types, gint *count) { - *count = navailable_types; + *count = 1; *visual_types = available_types; } GList* gdk_list_visuals (void) { - GList *list; - guint i; - - list = NULL; - for (i = 0; i < nvisuals; ++i) - list = g_list_append (list, (gpointer) &visuals[i]); - - return list; + return g_list_append (NULL, (gpointer) system_visual); } GdkVisual* gdk_visual_lookup (Visual *xvisual) { - GdkVisual *visual; - - if (!visual_hash) + if (system_visual->xvisual == xvisual) + return (GdkVisual *) system_visual; + else return NULL; - - visual = g_hash_table_lookup (visual_hash, xvisual); - return visual; } GdkVisual* gdkx_visual_get (VisualID xvisualid) { - int i; - - for (i = 0; i < nvisuals; i++) - if (xvisualid == visuals[i].xvisual->visualid) - return (GdkVisual*) &visuals[i]; - - return NULL; -} - -static void -gdk_visual_add (GdkVisual *visual) -{ - GdkVisualPrivate *private; - - if (!visual_hash) - visual_hash = g_hash_table_new ((GHashFunc) gdk_visual_hash, - (GCompareFunc) gdk_visual_compare); - - private = (GdkVisualPrivate*) visual; - - g_hash_table_insert (visual_hash, private->xvisual, visual); + if (xvisualid == system_visual->xvisual->visualid) + return (GdkVisual*) system_visual; + else + return NULL; } static void @@ -508,19 +360,3 @@ gdk_visual_decompose_mask (gulong mask, mask >>= 1; } } - -/* This hash stuff is pretty useless on Windows, as there is only - one visual... */ - -static guint -gdk_visual_hash (Visual *key) -{ - return key->visualid; -} - -static gint -gdk_visual_compare (Visual *a, - Visual *b) -{ - return (a->visualid == b->visualid); -} diff --git a/gdk/win32/gdkvisual.c b/gdk/win32/gdkvisual.c index 70f513c4e0..f274117954 100644 --- a/gdk/win32/gdkvisual.c +++ b/gdk/win32/gdkvisual.c @@ -29,24 +29,15 @@ #include #include "gdkx.h" -static void gdk_visual_add (GdkVisual *visual); static void gdk_visual_decompose_mask (gulong mask, gint *shift, gint *prec); -static guint gdk_visual_hash (Visual *key); -static gint gdk_visual_compare (Visual *a, - Visual *b); - static GdkVisualPrivate *system_visual; -static GdkVisualPrivate *visuals; -static gint nvisuals; -static gint available_depths[7]; -static gint navailable_depths; +static gint available_depths[1]; -static GdkVisualType available_types[6]; -static gint navailable_types; +static GdkVisualType available_types[1]; #ifdef G_ENABLE_DEBUG @@ -62,8 +53,6 @@ static const gchar* visual_names[] = #endif /* G_ENABLE_DEBUG */ -static GHashTable *visual_hash = NULL; - void gdk_visual_init (void) { @@ -94,242 +83,156 @@ gdk_visual_init (void) int rastercaps, numcolors, sizepalette, colorres, bitspixel; Visual *default_xvisual; - GdkVisualPrivate temp_visual; - int nxvisuals; - int i, j; - nxvisuals = 1; - visuals = g_new (GdkVisualPrivate, nxvisuals); + system_visual = g_new (GdkVisualPrivate, 1); + + bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL); + rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS); + default_xvisual = g_new (Visual, 1); + system_visual->xvisual = default_xvisual; + system_visual->xvisual->visualid = 0; + system_visual->xvisual->bitspixel = bitspixel; - nvisuals = 0; - for (i = 0; i < nxvisuals; i++) + if (rastercaps & RC_PALETTE) + { + system_visual->visual.type = GDK_VISUAL_PSEUDO_COLOR; + numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS); + sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE); + colorres = GetDeviceCaps (gdk_DC, COLORRES); + system_visual->xvisual->map_entries = sizepalette; + } + else if (bitspixel == 1) + { + system_visual->visual.type = GDK_VISUAL_STATIC_GRAY; + system_visual->xvisual->map_entries = 2; + } + else if (bitspixel == 4) + { + system_visual->visual.type = GDK_VISUAL_STATIC_COLOR; + system_visual->xvisual->map_entries = 16; + } + else if (bitspixel == 8) + { + system_visual->visual.type = GDK_VISUAL_STATIC_COLOR; + system_visual->xvisual->map_entries = 256; + } + else if (bitspixel == 16) { - if (1) + system_visual->visual.type = GDK_VISUAL_TRUE_COLOR; +#if 1 + /* This code by Mike Enright, + * see http://www.users.cts.com/sd/m/menright/display.html + */ + memset (&bmi, 0, sizeof (bmi)); + bmi.bi.biSize = sizeof (bmi.bi); + + hbm = CreateCompatibleBitmap (gdk_DC, 1, 1); + GetDIBits (gdk_DC, hbm, 0, 1, NULL, + (BITMAPINFO *) &bmi, DIB_RGB_COLORS); + GetDIBits (gdk_DC, hbm, 0, 1, NULL, + (BITMAPINFO *) &bmi, DIB_RGB_COLORS); + DeleteObject (hbm); + + if (bmi.bi.biCompression != BI_BITFIELDS) { - bitspixel = GetDeviceCaps (gdk_DC, BITSPIXEL); - rastercaps = GetDeviceCaps (gdk_DC, RASTERCAPS); - default_xvisual = g_new (Visual, 1); - visuals[nvisuals].xvisual = default_xvisual; - visuals[nvisuals].xvisual->visualid = nvisuals; - visuals[nvisuals].xvisual->bitspixel = bitspixel; - - if (rastercaps & RC_PALETTE) + /* Either BI_RGB or BI_RLE_something + * .... or perhaps (!!) something else. + * Theoretically biCompression might be + * mmioFourCC('c','v','i','d') but I doubt it. + */ + if (bmi.bi.biCompression == BI_RGB) { - visuals[nvisuals].visual.type = GDK_VISUAL_PSEUDO_COLOR; - numcolors = GetDeviceCaps (gdk_DC, NUMCOLORS); - sizepalette = GetDeviceCaps (gdk_DC, SIZEPALETTE); - colorres = GetDeviceCaps (gdk_DC, COLORRES); - visuals[nvisuals].xvisual->map_entries = sizepalette; + /* It's 555 */ + bitspixel = 15; + system_visual->visual.red_mask = 0x00007C00; + system_visual->visual.green_mask = 0x000003E0; + system_visual->visual.blue_mask = 0x0000001F; } - else if (bitspixel == 1) - { - visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_GRAY; - visuals[nvisuals].xvisual->map_entries = 2; - } - else if (bitspixel == 4) + else { - visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR; - visuals[nvisuals].xvisual->map_entries = 16; + g_assert_not_reached (); } - else if (bitspixel == 8) + } + else + { + DWORD allmasks = + bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2]; + int k = 0; + while (allmasks) { - visuals[nvisuals].visual.type = GDK_VISUAL_STATIC_COLOR; - visuals[nvisuals].xvisual->map_entries = 256; + if (allmasks&1) + k++; + allmasks/=2; } - else if (bitspixel == 16) - { - visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR; -#if 1 - /* This code by Mike Enright, - * see http://www.users.cts.com/sd/m/menright/display.html - */ - memset (&bmi, 0, sizeof (bmi)); - bmi.bi.biSize = sizeof (bmi.bi); - - hbm = CreateCompatibleBitmap (gdk_DC, 1, 1); - GetDIBits (gdk_DC, hbm, 0, 1, NULL, - (BITMAPINFO *) &bmi, DIB_RGB_COLORS); - GetDIBits (gdk_DC, hbm, 0, 1, NULL, - (BITMAPINFO *) &bmi, DIB_RGB_COLORS); - DeleteObject (hbm); - - if (bmi.bi.biCompression != BI_BITFIELDS) - { - /* Either BI_RGB or BI_RLE_something - * .... or perhaps (!!) something else. - * Theoretically biCompression might be - * mmioFourCC('c','v','i','d') but I doubt it. - */ - if (bmi.bi.biCompression == BI_RGB) - { - /* It's 555 */ - bitspixel = 15; - visuals[nvisuals].visual.red_mask = 0x00007C00; - visuals[nvisuals].visual.green_mask = 0x000003E0; - visuals[nvisuals].visual.blue_mask = 0x0000001F; - } - else - { - g_assert_not_reached (); - } - } - else - { - DWORD allmasks = - bmi.u.fields[0] | bmi.u.fields[1] | bmi.u.fields[2]; - int k = 0; - while (allmasks) - { - if (allmasks&1) - k++; - allmasks/=2; - } - bitspixel = k; - visuals[nvisuals].visual.red_mask = bmi.u.fields[0]; - visuals[nvisuals].visual.green_mask = bmi.u.fields[1]; - visuals[nvisuals].visual.blue_mask = bmi.u.fields[2]; - } + bitspixel = k; + system_visual->visual.red_mask = bmi.u.fields[0]; + system_visual->visual.green_mask = bmi.u.fields[1]; + system_visual->visual.blue_mask = bmi.u.fields[2]; + } #else - /* Old, incorrect (but still working) code. */ + /* Old, incorrect (but still working) code. */ #if 0 - visuals[nvisuals].visual.red_mask = 0x0000F800; - visuals[nvisuals].visual.green_mask = 0x000007E0; - visuals[nvisuals].visual.blue_mask = 0x0000001F; + system_visual->visual.red_mask = 0x0000F800; + system_visual->visual.green_mask = 0x000007E0; + system_visual->visual.blue_mask = 0x0000001F; #else - visuals[nvisuals].visual.red_mask = 0x00007C00; - visuals[nvisuals].visual.green_mask = 0x000003E0; - visuals[nvisuals].visual.blue_mask = 0x0000001F; + system_visual->visual.red_mask = 0x00007C00; + system_visual->visual.green_mask = 0x000003E0; + system_visual->visual.blue_mask = 0x0000001F; #endif #endif - } - else if (bitspixel == 24 || bitspixel == 32) - { - visuals[nvisuals].visual.type = GDK_VISUAL_TRUE_COLOR; - visuals[nvisuals].visual.red_mask = 0x00FF0000; - visuals[nvisuals].visual.green_mask = 0x0000FF00; - visuals[nvisuals].visual.blue_mask = 0x000000FF; - } - else - g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel); - - visuals[nvisuals].visual.depth = bitspixel; - visuals[nvisuals].visual.byte_order = GDK_LSB_FIRST; - visuals[nvisuals].visual.bits_per_rgb = 42; /* Not used? */ - - if ((visuals[nvisuals].visual.type == GDK_VISUAL_TRUE_COLOR) || - (visuals[nvisuals].visual.type == GDK_VISUAL_DIRECT_COLOR)) - { - gdk_visual_decompose_mask (visuals[nvisuals].visual.red_mask, - &visuals[nvisuals].visual.red_shift, - &visuals[nvisuals].visual.red_prec); - - gdk_visual_decompose_mask (visuals[nvisuals].visual.green_mask, - &visuals[nvisuals].visual.green_shift, - &visuals[nvisuals].visual.green_prec); - - gdk_visual_decompose_mask (visuals[nvisuals].visual.blue_mask, - &visuals[nvisuals].visual.blue_shift, - &visuals[nvisuals].visual.blue_prec); - visuals[nvisuals].xvisual->map_entries = - 1 << (MAX (visuals[nvisuals].visual.red_prec, - MAX (visuals[nvisuals].visual.green_prec, - visuals[nvisuals].visual.blue_prec))); - } - else - { - visuals[nvisuals].visual.red_mask = 0; - visuals[nvisuals].visual.red_shift = 0; - visuals[nvisuals].visual.red_prec = 0; - - visuals[nvisuals].visual.green_mask = 0; - visuals[nvisuals].visual.green_shift = 0; - visuals[nvisuals].visual.green_prec = 0; - - visuals[nvisuals].visual.blue_mask = 0; - visuals[nvisuals].visual.blue_shift = 0; - visuals[nvisuals].visual.blue_prec = 0; - } - visuals[nvisuals].visual.colormap_size = visuals[nvisuals].xvisual->map_entries; - - nvisuals += 1; - } } - - for (i = 0; i < nvisuals; i++) + else if (bitspixel == 24 || bitspixel == 32) { - for (j = i+1; j < nvisuals; j++) - { - if (visuals[j].visual.depth >= visuals[i].visual.depth) - { - if ((visuals[j].visual.depth == 8) && (visuals[i].visual.depth == 8)) - { - if (visuals[j].visual.type == GDK_VISUAL_PSEUDO_COLOR) - { - temp_visual = visuals[j]; - visuals[j] = visuals[i]; - visuals[i] = temp_visual; - } - else if ((visuals[i].visual.type != GDK_VISUAL_PSEUDO_COLOR) && - visuals[j].visual.type > visuals[i].visual.type) - { - temp_visual = visuals[j]; - visuals[j] = visuals[i]; - visuals[i] = temp_visual; - } - } - else if ((visuals[j].visual.depth > visuals[i].visual.depth) || - ((visuals[j].visual.depth == visuals[i].visual.depth) && - (visuals[j].visual.type > visuals[i].visual.type))) - { - temp_visual = visuals[j]; - visuals[j] = visuals[i]; - visuals[i] = temp_visual; - } - } - } + system_visual->visual.type = GDK_VISUAL_TRUE_COLOR; + system_visual->visual.red_mask = 0x00FF0000; + system_visual->visual.green_mask = 0x0000FF00; + system_visual->visual.blue_mask = 0x000000FF; } + else + g_error ("gdk_visual_init: unsupported BITSPIXEL: %d\n", bitspixel); - for (i = 0; i < nvisuals; i++) - if (default_xvisual->visualid == visuals[i].xvisual->visualid) - { - system_visual = &visuals[i]; - break; - } + system_visual->visual.depth = bitspixel; + system_visual->visual.byte_order = GDK_LSB_FIRST; + system_visual->visual.bits_per_rgb = 42; /* Not used? */ - navailable_depths = 0; - for (i = 0; i < npossible_depths; i++) + if ((system_visual->visual.type == GDK_VISUAL_TRUE_COLOR) || + (system_visual->visual.type == GDK_VISUAL_DIRECT_COLOR)) { - for (j = 0; j < nvisuals; j++) - { - if (visuals[j].visual.depth == possible_depths[i]) - { - available_depths[navailable_depths++] = visuals[j].visual.depth; - break; - } - } + gdk_visual_decompose_mask (system_visual->visual.red_mask, + &system_visual->visual.red_shift, + &system_visual->visual.red_prec); + + gdk_visual_decompose_mask (system_visual->visual.green_mask, + &system_visual->visual.green_shift, + &system_visual->visual.green_prec); + + gdk_visual_decompose_mask (system_visual->visual.blue_mask, + &system_visual->visual.blue_shift, + &system_visual->visual.blue_prec); + system_visual->xvisual->map_entries = + 1 << (MAX (system_visual->visual.red_prec, + MAX (system_visual->visual.green_prec, + system_visual->visual.blue_prec))); } + else + { + system_visual->visual.red_mask = 0; + system_visual->visual.red_shift = 0; + system_visual->visual.red_prec = 0; - if (navailable_depths == 0) - g_error ("unable to find a usable depth"); + system_visual->visual.green_mask = 0; + system_visual->visual.green_shift = 0; + system_visual->visual.green_prec = 0; - navailable_types = 0; - for (i = 0; i < npossible_types; i++) - { - for (j = 0; j < nvisuals; j++) - { - if (visuals[j].visual.type == possible_types[i]) - { - available_types[navailable_types++] = visuals[j].visual.type; - break; - } - } + system_visual->visual.blue_mask = 0; + system_visual->visual.blue_shift = 0; + system_visual->visual.blue_prec = 0; } + system_visual->visual.colormap_size = system_visual->xvisual->map_entries; - for (i = 0; i < nvisuals; i++) - gdk_visual_add ((GdkVisual*) &visuals[i]); - - if (npossible_types == 0) - g_error ("unable to find a usable visual type"); + available_depths[0] = system_visual->visual.depth; + available_types[0] = system_visual->visual.type; } GdkVisual* @@ -365,67 +268,43 @@ gdk_visual_get_system (void) GdkVisual* gdk_visual_get_best (void) { - return ((GdkVisual*) &(visuals[0])); + return ((GdkVisual*) system_visual); } GdkVisual* gdk_visual_get_best_with_depth (gint depth) { - GdkVisual *return_val; - int i; - - return_val = NULL; - for (i = 0; i < nvisuals; i++) - if (depth == visuals[i].visual.depth) - { - return_val = (GdkVisual*) &(visuals[i]); - break; - } - - return return_val; + if (depth == system_visual->visual.depth) + return (GdkVisual*) system_visual; + else + return NULL; } GdkVisual* gdk_visual_get_best_with_type (GdkVisualType visual_type) { - GdkVisual *return_val; - int i; - - return_val = NULL; - for (i = 0; i < nvisuals; i++) - if (visual_type == visuals[i].visual.type) - { - return_val = (GdkVisual*) &(visuals[i]); - break; - } - - return return_val; + if (visual_type == system_visual->visual.type) + return (GdkVisual*) system_visual; + else + return NULL; } GdkVisual* gdk_visual_get_best_with_both (gint depth, GdkVisualType visual_type) { - GdkVisual *return_val; - int i; - - return_val = NULL; - for (i = 0; i < nvisuals; i++) - if ((depth == visuals[i].visual.depth) && - (visual_type == visuals[i].visual.type)) - { - return_val = (GdkVisual*) &(visuals[i]); - break; - } - - return return_val; + if ((depth == system_visual->visual.depth) && + (visual_type == system_visual->visual.type)) + return (GdkVisual*) system_visual; + else + return NULL; } void gdk_query_depths (gint **depths, gint *count) { - *count = navailable_depths; + *count = 1; *depths = available_depths; } @@ -433,59 +312,32 @@ void gdk_query_visual_types (GdkVisualType **visual_types, gint *count) { - *count = navailable_types; + *count = 1; *visual_types = available_types; } GList* gdk_list_visuals (void) { - GList *list; - guint i; - - list = NULL; - for (i = 0; i < nvisuals; ++i) - list = g_list_append (list, (gpointer) &visuals[i]); - - return list; + return g_list_append (NULL, (gpointer) system_visual); } GdkVisual* gdk_visual_lookup (Visual *xvisual) { - GdkVisual *visual; - - if (!visual_hash) + if (system_visual->xvisual == xvisual) + return (GdkVisual *) system_visual; + else return NULL; - - visual = g_hash_table_lookup (visual_hash, xvisual); - return visual; } GdkVisual* gdkx_visual_get (VisualID xvisualid) { - int i; - - for (i = 0; i < nvisuals; i++) - if (xvisualid == visuals[i].xvisual->visualid) - return (GdkVisual*) &visuals[i]; - - return NULL; -} - -static void -gdk_visual_add (GdkVisual *visual) -{ - GdkVisualPrivate *private; - - if (!visual_hash) - visual_hash = g_hash_table_new ((GHashFunc) gdk_visual_hash, - (GCompareFunc) gdk_visual_compare); - - private = (GdkVisualPrivate*) visual; - - g_hash_table_insert (visual_hash, private->xvisual, visual); + if (xvisualid == system_visual->xvisual->visualid) + return (GdkVisual*) system_visual; + else + return NULL; } static void @@ -508,19 +360,3 @@ gdk_visual_decompose_mask (gulong mask, mask >>= 1; } } - -/* This hash stuff is pretty useless on Windows, as there is only - one visual... */ - -static guint -gdk_visual_hash (Visual *key) -{ - return key->visualid; -} - -static gint -gdk_visual_compare (Visual *a, - Visual *b) -{ - return (a->visualid == b->visualid); -} diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 2a306987bd..c2ac52124a 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -31,7 +31,6 @@ #include #include #include "gdkprivate.h" -#include "gdkinput.h" /* The Win API function AdjustWindowRect may return negative values * resulting in obscured title bars. This helper function is coreccting it. diff --git a/gdk/win32/gdkwindow.c b/gdk/win32/gdkwindow.c index 2a306987bd..c2ac52124a 100644 --- a/gdk/win32/gdkwindow.c +++ b/gdk/win32/gdkwindow.c @@ -31,7 +31,6 @@ #include #include #include "gdkprivate.h" -#include "gdkinput.h" /* The Win API function AdjustWindowRect may return negative values * resulting in obscured title bars. This helper function is coreccting it. -- 2.30.2